Как определить, выполняется ли script как nohup или нет?
Я попробовал запустить script с помощью nohup like,
nohup script.sh &
Когда я попробовал
ps -ef | grep "script.sh"
Я не мог найти его там, кроме grep, который запускается с этой строкой в качестве параметра.
Я делаю это правильно? Означает ли это, что процесс действительно закончился?
Спасибо.
Ответы
Ответ 1
В начале вашей оболочки script напишите PID в файл (например, в /var/run ). Затем вы можете просто найти этот PID, чтобы узнать, завершен ли процесс или нет. Вы можете получить PID вашей оболочки script с помощью встроенной переменной $$
.
Чтобы записать PID, поставьте вверху вашего script:
echo $$ > /var/run/myscript.pid
Затем, чтобы проверить, все ли работает:
ps -p `cat /var/run/myscript.pid`
Возможно, вы не сможете записать в /var/run
как обычный пользователь. Если нет, просто используйте /tmp
Ответ 2
При условии выполнения nohup, но в большинстве случаев он будет работать.
После запуска
nohup script.sh &
сохранить PID в переменной. $! это PID последнего фонового процесса.
HISPID=$!
Затем вы можете проверить, есть ли там с ps или kill:
ps -p $HISPID
kill -0 $HISPID
В отличие от другого опубликованного решения, это не требует изменения script.sh
Ответ 3
$! определенно является частью ksh и ksh93.
echo $SHELL
покажет вам, какую оболочку вы используете.
Пример разумного использования &
#!/bin/ksh
nohup ./myscript.sh argument1 2>&1> mylogfile &
# do some other task
cnt=0
while [ $cnt -le 100 ]
do
# work on another task here
cnt=$(( $cnt + 1 ))
done
wait
Оператор wait приостанавливает выполнение любого дочернего процесса, выполняющегося по-прежнему. Обычно вы не выкладываете процесс на задний план, ожидаете, что он будет работать вечно, а затем полностью забудет его.
Если вам нужен полностью отсоединенный процесс, который выполняется навсегда, рассмотрите демон. Некоторые люди пишут демона в оболочке - не лучшая практика, но это делается. Обычно UNIX-демоны записываются на C.
Глава 13 расширенного программирования Стивенса в среде UNIx '2ed - все о демонах.
Ответ 4
Я последовал предложению scompt.com, изменяя мой script, чтобы сохранить pid
Тогда я заметил, что pid
записывается на выход, поэтому нет необходимости его хранить:
$ nohup ./sync-all.production.sh > sync-all.production.log &
[1] 3428
Ответ 5
что работает
sudo ps -e | grep [script name or fragment of name]
например, для script с именем "mf-sync.js"
sudo ps -e | grep mf-sync
отображает имя script и pid; то я могу использовать, например, если pid был 1234
sudo kill 1234
next Мне нужно добавить тайм-аут, чтобы автоматически убить его, когда прошло достаточно времени, чтобы он работал нормально, но это еще один вопрос.
тем временем я могу присматривать за этим процессом, чтобы запустить синхронизацию для моего клиента, пока у меня не будет времени на проверку тайм-аута в script
Ответ 6
код:
ps r
чтобы сообщить обо всех запущенных процессах.