как узнать, завершен ли скрипт, запущенный как nohup, или нет?
-
05-10-2019 - |
Вопрос
Я попробовал запустить скрипт с помощью 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
сообщать обо всех запущенных процессах.