2010-05-31 1 views
14

Я попытался запустить скрипт, используя поЬир как,как найти, работает ли скрипт как nohup или нет?

nohup script.sh & 

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

ps -ef | grep "script.sh" 

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

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

ответ

13

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

Для записи PID, положить в верхней части вашего скрипта:

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

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

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

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

+0

Спасибо. Могу ли я использовать что-либо другое, кроме/var/run и/tmp like/home? – learner135

+0

Yup, все, что лучше всего подходит для вас. –

+9

Обратите внимание: PID иногда используются повторно (чаще всего на ОС без сильной случайности или на системах с большим количеством недолговечных процессов). Параноид может захотеть проверить, что процесс имеет правильный родительский ($$), или же дочерний скрипт удаляет файл myscript.pid при выходе (что-то вроде '' trap 'rm /var/run/myscript.pid EXIT' ') Или оба. – pra

11

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

nohup script.sh & 

магазин ПИД в переменную. $! является PID последнего фонового процесса.

HISPID=$! 

Затем вы можете проверить, если он там с пс или убить:

ps -p $HISPID 
kill -0 $HISPID 

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

+0

Спасибо, но выглядит как $! Не поддерживается в моей среде оболочки. Я использую ksh. – learner135

2

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

2

Я следовал предложению scompt.ком модифицируя мой скрипт для сохранения pid

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

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

[1] 3428 
0

, что работал в

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 

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

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

+0

как вы находите свой пароль sudo, если вы не помните, когда-либо создавали его? –

-1

Код:

ps r 

сообщить все работает процессы.

+0

Не могли бы вы подробнее рассказать о своем ответе добавив немного больше описания о предоставляемом вами решении? – abarisone