2016-01-10 38 views
1

我希望在另一個用戶的進程終止或終止後通過我的電子郵件得到通知。我可以通過其進程ID或「top」命令中出現的進程名稱來識別另一個用戶的進程。Linux:在進程id完成或被殺後發送郵件

爲了做同樣的我寫了下面的腳本:

while true; do 
    if ps -ef | grep -q 'process_name'; then 
    sleep 1 
    else 
    echo "complete" | mail -s "process exiting" [email protected] 
    fi 
done 

然而,我發現,其他用戶的進程結束或其他用戶殺死他或她的過程後,也還是我沒有得到任何通知或電子郵件。有人可以幫助我這一點。

+0

這真的是你使用的確切代碼嗎?您發送完整的郵件在無限循環中,這可能會導致您的地址或主機被阻止... – mata

+0

@mata是的這是我正在使用的代碼 –

+0

@mata有沒有我可以糾正的一些方法我的代碼 –

回答

3

問題是最有可能這個檢查:

if ps -ef | grep -q 'process_name'; then 

這將永遠是true。爲什麼?只需直接在命令行上運行它沒有-qgrep,這將是明顯的:

$ ps -ef | grep 'process_name' 
user 4550 3349 0 09:17 pts/0 00:00:00 grep --colour=auto process_name 
$ echo $? 
0 

上面的例子表明,grep永遠是成功的,因爲它發現自己!

有很多方法可以解決這個問題。一種方法是使用pgrep而不是grep

if pgrep 'process_name' > /dev/null; then 
+0

是否有某種方式可以指定進程ID而不是進程名稱 –

+0

是的,您可以使用'kill -0'來執行該操作,該操作只檢查是否存在pid。即:'如果kill -0 $ pid 2>/dev/null;那麼' – kaylum

+0

有什麼辦法可以匹配「命令」的值。例如,在上面的IF語句中,使用字符串匹配來等於值「command」? – neo

2

另一種常見的技術,以防止匹配自己的grep過程是圍繞一個字母的圖案[],像這樣:

grep -q '[p]rocess_name' 

如果你知道的過程中,那麼你不需要grep可言,你可以使用的ps自身的退出代碼:

if ps -p pid &> /dev/null; then 
    sleep 1 

其中pid是當然的進程ID。

+0

哇,整潔。不知道這個小寶石。 – kaylum

+0

是否有某種方式可以指定進程ID而不是進程名稱 –

+0

@JannatArora在這種情況下,有一種比grep更好的方法,單獨使用ps,查看我更新的答案 – janos