2017-08-28 14 views
2

通過基於一個我發現谷歌搜索這個腳本,但是如果Davmail運行腳本殺死它。如果Davmail沒有運行,腳本不會啓動它。我究竟做錯了什麼?我已經運行pgrep -f davmail | wc -w新的cron腳本來檢查davmail pid,如果不執行任何操作。如果沒有運行重新啓動

#!/bin/bash 
case "$(pgrep -f davmail | wc -w)" in 

0) echo "Restarting DavMail:  $(date)" >> /var/log/davmail.txt 
    /home/user/Downloads/davmail-linux-x86_64-4.8.0-2479/davmail.sh & 
    ;; 
1) # all ok 
    ;; 
*) echo "Removed double Davmail: $(date)" >> /var/log/davmail.txt 
    kill $(pgrep -f davmail | awk '{print $1}') 
    ;; 
esac 
+0

只是刪除DBL-引號' 「$(p纖ep -f ...)」'?祝你好運。 – shellter

回答

1

我已經驗證了狀態代碼運行pgrep -f davmail | wc -w

這不是你如何驗證狀態代碼驗證的狀態碼。 您可以通過檢查$?的值來驗證狀態代碼。

但真正的問題是,wc -w輸出用空格補齊,並在case "..." in你雙引號的值, 所以只有*)將匹配。

的另一個問題是,雖然評論說:「去掉雙Davmail」, 命令會有殺死所有的匹配過程, 不僅僅是「雙Davmail」。 如果您打算保留一個進程並殺死所有其他進程,則需要修復該進程。

下面就來解決上述問題的一種方法:

count=$(pgrep -f davmail | wc -w) 
if [ $count = 0 ]; then 
    echo "Restarting DavMail:  $(date)" >> /var/log/davmail.txt 
    /home/user/Downloads/davmail-linux-x86_64-4.8.0-2479/davmail.sh & 
elif [ $count != 1 ]; then 
    echo "Removed double Davmail: $(date)" >> /var/log/davmail.txt 
    kill $(pgrep -f davmail | sed -e 1d) 
fi 
+0

謝謝janos。使用你的變體我仍然有一個問題。 '15:57:13bhart @ Vostok/etc/cron.d $ pgrep -f davmail | WC -w 十五時57分23秒bhart @東方/etc/cron.d中 $須藤./davmail_check.sh [1] 26216終止須藤。/ davmail_check.sh' THER EIS無davmail進程正在運行,但是腳本只是返回一個已終止的消息......除非它看到grep作爲一個pis被終止? – Skeer

+0

@Skeer由於註釋中的代碼塊沒有格式化,所以很難弄清楚發生了什麼。但它看起來像'sudo ./davmail_check.sh'終止了,這不是你問題中發佈代碼的一部分。也許你想發佈一個新的問題,更多關於這個新場景的細節。 – janos

+0

不,我只是手動調用腳本是所有的問題。這不是一個適當的測試方法嗎?我可以把它扔到一個IDE中,然後從那裏運行它。 – Skeer

相關問題