2016-04-25 19 views
2

Testという名前のC++実行可能ファイルがあります。実行が完了したら、GetExitCodeProcess()コードを調べる必要があります。bashでプロセスの終了ステータスを取得

私は、次のような他のラッパープログラムに次のように書くことによってステータスコードを見つけることができます。その後、

... 
int status = system("./Test"); 

およびWIFSIGNALED/WIFSTOPPEDなどのステータスをチェックします。

ラッパープログラムを書く代わりに、.TestプログラムのPIDから終了ステータスコードを取得することはできますか?

編集: ./Testを実行した後にbashに '$'を書き込むと、上記の問題が解決されますか?

編集:要約 - コマンドラインから実行可能ファイルを実行すると、どのようにして(プログラムではない)終了ステータスが得られますか?

+0

あなたはC++を使用してスクリプトを呼び出し、C++を使用して終了ステータスを取得しています。別のスクリプトを呼び出さないでください。あまりにも多くのことが起こります。 – SaintHax

答えて

3

プログラムの終了コードを出力するコマンド/ bashを実行した後で、単にecho $?を実行することができます。

すべてのコマンドは終了ステータスを返します(返信 ステータスまたは終了コードとも呼ばれます)。成功したコマンドは0を返しますが、 が失敗した場合、通常はエラーコードとして と解釈される0以外の値が返されます。成功した場合、正常に動作したUNIXコマンド、プログラム、およびユーティリティは、 0終了コードを返しますが、いくつかの例外があります。代わりに

echo $? # Non-zero exit status returned -- command failed to execute. 

echo 

exit 113 # Will return 113 to shell. 
      # To verify this, type "echo $?" after script terminates. 

# By convention, an 'exit 0' indicates success, 
#+ while a non-zero exit value means an error or anomalous condition. 

あなたは(nohupで開始またはバックグラウンド&オペレータで実行)バックグラウンド・プロセス/スクリプトのリターンコードを特定したい場合は、プロセス/スクリプトのpidが始めることができ、それが終了するのを待ち、終了コードを取得します。

$ ./foo.sh & 
[1] 28992   # Some random number for the process-id 

$ echo $!   # Get process id of the background process 
28992 

$ wait 28992  # Waits until the process determined by the number is complete 

[1]+ Done   ./foo.sh 

$ echo $?   # Prints the return code of the process 
0 

http://tldp.org/LDP/abs/html/exit-status.html

+0

私はそうは思わない、b/c system()はすでに彼に同じ情報$を与えているのだろうか?そうです。この回答はupvotesを受け取っている間、bashスクリプトを呼び出すC++プログラムではなく、別のスクリプトを呼び出すbashスクリプトに適用されます。 OPの私の理解から。 – SaintHax

+0

私はOP 'から覚えていますが、ラッパープログラムを書く代わりに、bashスクリプトを書くことで.TestプログラムのPIDから終了ステータスコードを取得できますか?'これは基本的に別のスクリプトを呼び出すbashスクリプトです。この場合には無関係であると判明した場合は、投稿を削除するようにしてください。 – Inian

1

@詳細情報あなたは(このwrong--システムに近づいている)既に存在している状態を返します。失敗を成功のためのゼロ、非ゼロ。 「テスト」スクリプトが正しく書かれていないか、「ステータス」が間違ってテストされている可能性があります。私は開発者から次のスクリプトミスを見てきました。

run_some_java 
echo "Done" 

終了コードを追跡していないときは、スクリプトはechoコマンドの最後の終了コードを返します。それは常にそれを成功させる。ここで正しく終了するには2つの方法があります(そして、私は他のコーダーも知っていますが、いくつかの高度な方法がこの最初の方法よりも優れていますが、これはこのスレッドに関するものではないと思います)。クロールし、歩いてから実行します。

終了ステータスが必要な場合は、すべてのシェルコマンドを実行する必要がある場合。

return_code=0 

mv $letters $ARCHIVE 
return_code=$(($return_code + $?)) 

mv $letters $ARCHIVE 
return_code=$(($return_code + $?)) 

exit $return_code 

あなたが失敗した場合に終了する場合は、そこに見てset -eであり、ここでは別の方法です。

l
関連する問題