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



Я попробовал запустить скрипт, используя nohup, например,



nohup script.sh &


Когда я пытался



ps -ef | grep "script.sh"


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



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

670   6  

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 последнего фонового процесса.

HISPID=$!

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

ps -p $HISPID
kill -0 $HISPID

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

$! - определенно часть КШ и 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 посвящена демонам.

Я последовал предложению: 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

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

Comments

    Ничего не найдено.