6

その中のnohupドキュメントから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

ただし、nohupから取得した終了コードは1と0のみです。スクリプト内から失敗するnohupコマンドがあり、適切に例外が必要です...このドキュメントに基づいて、 nohupの終了コード126である必要があります。代わりに、0です。

私が実行しているコマンドは次のとおりです。nohup perl myscript.pl &

これは、perlが正常に終了しているためですか?

4

2 に答える 2

17

シェルスクリプトが次のようにプロセスを実行する場合:

nohup perl myscript.pl &

から終了ステータスを収集する機会を多かれ少なかれ見過ごしていますnohup。コマンドは全体として、シェルがフォークした場合は0で成功し、シェルがフォークに失敗した場合は1で失敗します。では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はサブシェル内で同期的に実行されることに注意してください。

于 2013-03-27T01:31:25.587 に答える
2

私の理解では、問題は、nohupで実行されているときにコマンドステータスを取得する方法でした。私の経験では、コマンドがすぐに失敗した場合でも、コマンドの終了ステータスを取得できる可能性はほとんどありませんでした。ジョナサンが述べたように待機または同期しない限り、ほとんどの場合、「nohup COMMAND&」終了ステータスになります。nohupの直後にCOMMANDステータスを確認するには、次を使用します。

 
  pid = `ps -eo pid、cmd | awk'/ COMMAND / {print $ 1}' `
  if [-z $ pid]; それから
     エコー「コマンドが失敗しました」
  そうしないと
     echo"コマンドはnohupで実行されています"
  fi
于 2016-01-11T17:21:08.053 に答える