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

StackOverflow https://stackoverflow.com/questions/2944004

Вопрос

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

nohup script.sh &

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

ps -ef | grep "script.sh"

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

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

Это было полезно?

Решение

В начале сценария оболочки запишите 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

Оператор ожидания приостанавливает работу любого еще работающего дочернего процесса.Обычно вы не переводите процесс в фоновый режим, ожидаете, что он будет работать вечно, а затем полностью забываете о нем.

Если вам нужен полностью автономный процесс, который работает вечно, рассмотрите демон.Некоторые люди пишут демонов в оболочке — не лучшая практика, — но это сделано.Обычно демоны 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top