2013-03-27 4 views
3

Из документации поЬира в info coreutils 'nohup invocation' говорится:Как получить правильный код выхода из поЬир

Exit status: 

125 if `nohup' itself fails, and `POSIXLY_CORRECT' is not set 
126 if COMMAND is found but cannot be invoked 
127 if COMMAND cannot be found 
the exit status of COMMAND otherwise 

Однако единственный выход кодой я когда-либо получал от поЬира была 1 и 0. У меня есть поЬир команда, которая терпит неудачу из сценария, и мне нужно исключение надлежащим образом ... и на основе этой документации, которую я хотел бы предположить, что поЬир код выхода должен быть 126. Вместо этого, он равен 0.

команда I пробег: nohup perl myscript.pl &

Это потому, что perl успешно завершается?

+1

Пробуйте гораздо более простые тесты, чтобы узнать, не указала ли nohup документированные значения. 'nohup true; echo $? ',' nohup false; echo $? ',' nohup nonesuch; echo $? ', из командной строки unix должен дать вам некоторую рабочую обратную связь. Удачи. – shellter

+1

Что такое код выхода, если вы запустили 'perl myscript.pl' в той же конфигурации (среда и т. Д.)? Если ваш скрипт выходит с 0, тогда perl выйдет с 0. Perl будет проходить по коду выхода вашего сценария. Сам Perl выйдет с различными ошибками, если он не может запустить сценарий (например, 13 для недопустимых разрешений для файла). –

+0

Этот вопрос действительно принадлежит Суперпользователю. –

ответ

8

Если сценарий оболочки запускает процесс с:

nohup perl myscript.pl & 

вы более или менее отказаться от шанса собрать статус выхода из nohup. Команда в целом преуспевает с 0, если оболочка раздваивается и терпит неудачу с 1, если оболочка не работает fork. В bash, вы можете ждать фоновый процесс, чтобы умереть и собрать свой статус через wait:

nohup perl myscript.pl & 
oldpid=$! 
...do something else or this whole rigmarole is pointless... 
wait $oldpid 
echo $? 

отражаемых $?, как правило, статус выхода из указанного PID (если указанный PID не был уже умер и ждали).

Если запустить процесс синхронно, вы можете обнаружить различные статусы выхода:

(
nohup perl myscript.pl 
echo "PID $! exited with status $?" >&2 
) & 

И теперь вы должны быть в состоянии определить различные статусы выхода из nohup (например, попробовать различные опечатки: nohup pearl myscript.pl, и т.д.) ,

Обратите внимание, что суб-оболочка в целом выполняется в фоновом режиме, но nohup выполняется синхронно в под-оболочке.

+0

wait $ oldpid будет казаться ожидающим навсегда .. – arganzheng

+0

@arganzheng: Он будет ждать, пока фоновый процесс ('nohup perl myscript.pl' в примере) завершается. Когда я запускаю следующий код в Bash, он ведет себя так, как я ожидал, заканчивая примерно через 5 секунд: 'sleep 5 & oldpid = $ !; echo oldpid = $ !; сон 3; echo Awake; wait $ oldpid; echo $? 'Например, это произвело:' oldpid = 40222', затем 'Awake' и, наконец,' 0'. –

0

Насколько я понимаю, вопрос состоял в том, как получить статус команды, когда он работал в nohup. По моему опыту было очень мало шансов, что вы смогли получить статус выхода COMMAND, даже когда он не сразу. В большинстве случаев вы только что получили статус «nohup COMMAND &», если вы не подождете или не синхронизируете, как упоминал Джонатан. Чтобы проверить статус COMMAND сразу после nohup, я использую:

 
    pid=`ps -eo pid,cmd | awk '/COMMAND/ {print $1}'` 
    if [ -z $pid ]; then 
    echo "the COMMAND failed" 
    else 
    echo "the COMMAND is running in nohup" 
    fi 
Смежные вопросы