2011-10-08 21 views
1

我目前正在編寫一個腳本,其目的是殺死一個運行時間超過閾值的進程。 「殺手」運行在一堆主機上,作業由服務器發送給每臺主機。我的想法是使用'ps'來獲得作業的運行時間,但它打印的全部是如何獲取通過ssh遠程創建的進程的時間?

17433 17433? 00:00:00 python

無論等待什麼。

我試圖找到一個簡化的例子,以避免發佈我寫的所有代碼。我們稱S爲服務器,H爲主機。

如果我執行以下步驟:

1)從服務器 2)蟒myscript.py(現在登錄在主機上) 3)PS -U登錄(仍然在主機上ssh登錄3 H )

我得到比上述至於時間而言00:00:00一個相同的結果。

我怎樣才能得到真正的執行時間?當我在本地機器上執行所有操作時,它可以正常工作。

非常感謝您的幫助。

+1

您可以使用ulimit運行每個進程嗎?然後,如果超過閾值,它們就會死亡。沒有必要殺死他們。 – lhf

+1

@lhf我認爲ulimit只能限制CPU時間,而不是自進程開始以來的總時間。 – chown

+0

@chown,我將「運行時間」解釋爲CPU時間... – lhf

回答

1

嘗試了這一點:

ps kstart_time -ef | grep myProc.py | awk '{print $5}' 

這將顯示proccess myProc.py的開始日期/時間:

[ 19:27 [email protected] ~ ]# ps kstart_time -ef | grep "httpd\|STIME" | awk '{print $5}' 
STIME 
19:25 

另一種選擇是etime

etime是因爲進程啓動,形式dd-hh:mm:ss所經過的時間。 dd是天數; hh,小時數;毫米,分鐘數; ss,秒數。

[ 19:47 [email protected] ~ ]# ps -eo cmd,etime 
CMD  ELAPSED 
/bin/sh 2-16:04:45 

而另一種方式做到這一點:

獲取進程PID和/proc讀出在相應的子目錄中的時間戳。

首先,使用ps命令(ps -efps aux)獲得過程PID

然後,使用ls命令顯示目錄的創建時間戳。

[ 19:57 [email protected] ~ ]# ls -ld /proc/1218 
dr-xr-xr-x 5 jon jon 0 Sep 20 16:14 /proc/1218 

您可以從該進程始於1218在9月20日16:14執行時間戳告訴。

+0

謝謝大家的回答! 我用曼尼D解決方案,工作正常! –

2

或者,你可以看看在創建在/ var /運行中的PID文件,假設你的過程中創建一個使用find命令,看它是否超過某一閾值:

find /var/run/ -name "myProcess.pid" -mtime +1d 

這將如果符合條件則返回文件名(至少1天前最後修改)。您可能還需要檢查以確保該過程實際上正在運行,因爲它可能已經崩潰並將PID留在後面。

+0

+1這將是我的答案的下一個編輯中的確切信息:)。 – chown

1

如果你想的過程有多久一直活着,你可以嘗試

stat -c %Y /proc/`pgrep python` 

..這會還給你的出現時間。如果交替地想要一次性殺死,我建議使用上面提到的查找(但也許指向/proc

相關問題