2017-01-06 22 views
1

私は8時間ごとにシェルスクリプトを起動し、一連のプログラムを呼び出します。時々、これらのプログラムは正常に終了せず、彼らは忘れ去られた状態で立ち往生します。シェルスクリプト内で起動された各プロセスのpidを確認します

私cron'dスクリプト(run_foo_bar.sh)は次のようになりますのであれば:

python foo.py 
python bar.py 

...私は、同時に複数のfooのバーのランニングを持つことができます。今はps -ax |grep fooを実行してPIDを取得し、ps -p $PID -o etime=を使用してランタイムを検索しますが、これは面倒です。

pythonプログラムにはコンソールに出力される一連のデバッグ文があり、シェルスクリプト自体がログファイルにパイプされます。私は、それがその起動時間と一緒に呼び出されます一度、各プロセスのPIDをエコーような方法を見つけたいと思ったので、私のrun_foo_bar.shは次のようになります。

date 
python foo.py 
<some magic to find PID> 
echo foo.py is running as PID $PID 

date 
python bar.py 
<some magic to find PID> 
echo bar.py is running as PID $PID 
+0

Pythonコードに何かを追加してPIDを自己報告して標準出力に入れることはできませんか?がんばろう。 – shellter

+0

多分[this](https://stackoverflow.com/a/13202292/2877364)? – cxw

+1

現在、 'python foo.py'は' foo.py'が終了するまで実行されます。この時点で取得するPIDはありません。あなたは明確にしていただけますか? 'foo.py'は背景や何かに動いていますか?プロセスが「リムボーに陥った」時をいつどのように知っていますか? – cxw

答えて

1

だから、完全性のため、Pythonの側で、あなた以下を行うことができます:

import os, sys 
print(os.getpid()) 
sys.stdout.flush() 

現在のPIDをダンプします。ターミナルではなくファイルに出力して、そのファイルから取り出すことができます。シェルで

、あなただけ実行するようにcronジョブを待っていることから、別のオプションは、(this answerから修正)これです:

python foo.py & echo "$!" > "some file somewhere that will hold the PID" ; fg 

バックグラウンドでpython foo.pyを実行し、pythonのPIDを節約しますプロセス(thisには$!にあります)を実行し、正常に実行できるように、pythonをフォアグラウンドに返します。

関連する問題