2017-06-06 9 views
0

私はPerforceサーバをクラッシュさせたときに再起動するために以下のbashスクリプトを実行していますが、私がしたいのは、bashスクリプトがPythonスクリプトを実行して終了私のスラックチャンネルへのアプリケーションのコード。bashの値をPythonに渡す

python app.py 225のようなものをPythonスクリプトで実行することができますが、それは動作しますが、$?python app.py $?のように渡します。

サービスエコーラインを再起動するたびに

は(それが225を示している端末で)適切に終了コードを報告したが、Pythonスクリプトに渡されたときに$? Pythonスクリプトの0として

#!/bin/bash 

until ~/Desktop/shell/p4d; do 
    echo "Perforce Server crashed with exit code $?. Respawning.." >&2 
    sleep 1 
    python ~/Desktop/shell/app.py $? 
done 

スニペットが表示されます引数を取得します。

if __name__ == "__main__": 
    error = str(sys.argv[1]) 
    print error 
    post_message(error) 

どうすればよいですか?

+0

終了コード '0' ... Bashは風変わりです;) – zwer

+0

' $? 'は' p4d'ではなく 'sleep 1'の終了コードです。 untilループの中に変数として格納してくださいftw –

+0

さて、ここでは何が起きているかについての[すばらしい答え](https://unix.stackexchange.com/a/99134)です。 – zwer

答えて

2

$?は、変数のように動作します。プログラム(p4d、sleep、pythonなど)を呼び出すたびに、そのコマンドの戻り値はbashによって$?に格納されます。

$?には、「エコー」するときの戻り値p4dが含まれています。その後、実際には "/ bin/sleep"というプログラムである "sleep"を呼び出すので、$?の値は0のスリープの戻りコードに置き換えられます。 したがって、pythonスクリプトは "0"よくあなたの問題を解決するために

、あなたはこのように、ローカル変数にリターン・コードをキャッシュできます? `$ '1'睡眠 'と' 0 'を保持しますが、おそらく、で終了、まあ

#!/bin/bash 

until ~/Desktop/shell/p4d; do 
    P4D_RETURN=$? 
    echo "Perforce Server crashed with exit code $?. Respawning.." >&2 
    sleep 1 
    python ~/Desktop/shell/app.py $P4D_RETURN 
done 
+0

理にかなっています! –

関連する問題