Перезапустить процесс по pid?

Вы должны использовать опцию --line-bufferedдля grep(, так как ваш вопрос помечен как "centos", вы наверняка используете GNU grep ).

По умолчанию grepбуферизация строк будет использоваться только тогда, когда вывод является терминалом (, точно так же, как функции stdio :printf, puts и т. д. ). Параметр --line-bufferedимеет приоритет над этим. GNU coreutils также имеет оболочку stdbuf (1 ), которая должна работать с любой динамически подключаемой программой, использующей stdio.

0
14.05.2020, 19:21
1 ответ

Как указано здесь , сигнала перезапуска нет. Вы должны выполнить процесс снова. Если это обычное дело, то стоит поместить эту программу в сервис, или простой циклический скрипт, чтобы с этим можно было справиться более органично.

Однако, если вам нужен еще один ненадежный 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, если хотите перевести задачу в фоновый режим.

1
28.04.2021, 23:14

Теги

Похожие вопросы