2017-01-06 86 views
1

我有一個cron作業,每8小時啓動一次shell腳本,然後調用一堆程序。有時候這些程序不會優雅地終止,它們會陷入僵局。查找shell腳本中調用的每個進程的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程序有一堆打印到控制檯的調試語句,並且shell腳本本身被傳送到日誌文件。我想找到一種方法,一旦它與它的調用時間一起調用會一唱一和進程的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

目前,'pyoo foo.py'會一直運行,直到'foo.py'退出,此時沒有PID。你能澄清一下嗎? 'foo.py'是否會自動移動到背景或其他東西?您如何知道流程何時「陷入僵局」? – cxw

回答

1

所以對於完整性,在Python端,您可以這樣做:

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

轉儲當前的PID。您可能希望將其打印到文件而不是終端,以便您可以從該文件中選取它。

在shell,因爲你只是等待cron作業運行,另一種選擇是這樣的(從this answer修改):

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

運行在後臺python foo.py,節省python的PID進程($!this),然後將python返回到前臺,以便它可以正常運行。