Как узнать, завершен ли скрипт как nohup или нет? - PullRequest
19 голосов
/ 31 мая 2010

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

nohup script.sh &

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

ps -ef | grep "script.sh"

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

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

Ответы [ 6 ]

15 голосов
/ 31 мая 2010

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

nohup script.sh &

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

HISPID=$!

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

ps -p $HISPID
kill -0 $HISPID

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

15 голосов
/ 31 мая 2010

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

Чтобы записать PID, поместите в начало вашего скрипта:

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

Затем, чтобы проверить, все ли еще работает:

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

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

3 голосов
/ 05 июля 2014

что сработало, это

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

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

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

3 голосов
/ 01 июня 2010

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

2 голосов
/ 16 мая 2014

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

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

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

[1] 3428
0 голосов
/ 25 марта 2015

Код:

ps r

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...