Вы должны использовать опцию --line-buffered
для grep
(, так как ваш вопрос помечен как "centos", вы наверняка используете GNU grep ).
По умолчанию grep
буферизация строк будет использоваться только тогда, когда вывод является терминалом (, точно так же, как функции stdio :printf, puts и т. д. ). Параметр --line-buffered
имеет приоритет над этим. GNU coreutils также имеет оболочку stdbuf (1 ), которая должна работать с любой динамически подключаемой программой, использующей stdio.
Как указано здесь , сигнала перезапуска нет. Вы должны выполнить процесс снова. Если это обычное дело, то стоит поместить эту программу в сервис, или простой циклический скрипт, чтобы с этим можно было справиться более органично.
Однако, если вам нужен еще один ненадежный bash-конвейер, то вам сюда. Это перезапустит программу от имени исполняющего пользователя без контекста безопасности (, так что не вызывайте это на чем-то, чему вы не доверяете!)
restart_pid() {
# First we need to find the program's arguments
SAVED_COMMAND="$(while IFS= read -r -d $'\0' f; do printf '%q ' "$f"; done < /proc/$1/cmdline)"
# Then we need to cd into its directory so that we stay as true to the intial conditions as possible
cd /proc/$1/cwd
# Now kill the process
kill $1
# Now we can restart the process
eval $SAVED_COMMAND
}
После этого вы можете позвонить restart_pid <pid>
на любой <pid>
, которому у вас есть разрешение на отправку сигналов.
Замените последнюю -, но -одну строку на eval $SAVED_COMMAND & disown
, если хотите перевести задачу в фоновый режим.