как узнать, завершен ли скрипт, выполняемый как nohup, или нет?

Я попытался запустить скрипт, используя nohup, как,

nohup script.sh &

когда я пробовал

ps -ef | grep "script.sh"

Я не мог найти его там, за исключением grep, который запускается с этой строкой в качестве параметра.

Я делаю это правильно?. Означает ли это, что процесс действительно завершил выполнение? Спасибо.

6 ответов


в начале сценария оболочки напишите PID в файл (например, в /var/run). Затем вы можете просто найти этот PID, чтобы узнать, выполнен ли процесс или нет. Вы можете получить PID своего скрипта оболочки, используя встроенный $$ переменной.

чтобы записать PID, поместите вверху своего скрипта:

echo $$ > /var/run/myscript.pid

затем, чтобы проверить, работает ли он:

ps -p `cat /var/run/myscript.pid`

возможно, вы не сможете написать в /var/run как обычный пользователь. Если нет, просто используйте /tmp


при условии реализации nohup, но в большинстве случаев это будет работать. После запуска

nohup script.sh &

сохраните PID в переменной. $! это PID последнего фонового процесса.

HISPID=$!

затем вы можете проверить, есть ли он с ps или kill:

ps -p $HISPID
kill -0 $HISPID

В отличие от другого опубликованного решения, это не требует изменения script.sh


$! определенно является частью 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 приостанавливает любой все еще запущенный дочерний процесс. Обычно вы не отбрасываете процесс на задний план, ожидая, что он будет работать вечно, а затем полностью забываете о нем.

Если вы хотите полностью отсоединенный процесс, который работает вечно, рассмотрим демона. Некоторые люди пишут демонов. в shell - не лучшая практика, но это делается. Обычно демоны UNIX пишутся на C.

Глава 13 Стивенса "расширенное программирование в среде UNIx" 2ed-это все о демонах.


я последовал предложению scompt.com изменение моего скрипта для хранения pid

тогда я заметил pid записывается на выход, поэтому нет необходимости хранить его:

$ nohup ./sync-all.production.sh > sync-all.production.log &

[1] 3428

что работал

sudo ps -e | grep [script name or fragment of name]

например, для скрипта с именем " mf-sync.js"

sudo ps -e | grep mf-sync

отображает имя скрипта и pid; тогда я могу использовать, например, если pid был 1234

sudo kill 1234

далее мне нужно добавить тайм-аут, чтобы автоматически убить его после истечения достаточного времени, чтобы он работал нормально, но это другой вопрос

тем временем я могу нянчиться с этим процессом, чтобы запустить синхронизацию для моего клиента, пока у меня не будет времени проверить тайм-аут в сценарий


код:

ps r

сообщать обо всех запущенных процессах.