2017-10-19 72 views
0

我工作的公司有一個crontab設置爲每隔幾分鐘運行一個給定的Shell腳本以執行某些複雜操作,而無需用戶干預。該腳本序列中的主要執行多個Perl腳本,首先檢查是否有客戶,他們尚未運行,採用以下結構多次:通過Shell腳本確定Linux進程是否在給定參數下運行

for i in `seq 1 20`; 
do 
    ps ax | grep ourFile10000008.p | grep pl 2>> /dev/null >> $LOG 
    if [ $? -eq 1 ] ; then 
     cd /path/to/the/script 
     perl ourFile10000008.pl 10000008 & 2>> $LOG 
    fi 
    ps ax | grep ourFile10000009.p | grep pl 2>> /dev/null >> $LOG 

    if [ $? -eq 1 ] ; then 
     cd /path/to/the/script 
     perl ourFile10000009.pl 10000009 & 2>> $LOG 
    fi 
    # (and so on, and so forth...) 
done 

這類作品,除了一個事實,即有現在我們的/path/to/the/script文件夾中有數十個「ourFile」Perl腳本,它們是彼此的精確副本!每當新客戶上線時,我們都需要創建一個新副本,這使得維護這個結構非常困難。

我努力讓自己在一個單一的文件(這裏[theOneFile.pl]命名),這個結構來看這是這些腳本的另一個副本,但被稱爲一個新的論點每次。這工作,但現在我必須確保我只傳遞每個參數一次運行此文件。

經過一番研究,並感謝This answer,我成功地確定了運行[theOneFile.pl]到pgrep -af theOneFile.pl | tr '\000' ' '| awk '{print $4}' >> $LOG後面的論點。但是,這給了我一個內容結果清單。爲了保持今天的邏輯不變,因爲有可能,我想只有以確定是否有與在給定的時間(例如theOneFile.pl 10000009)一個特定參數運行這些程序之一,但我不知道該怎麼辦所以。有任何想法嗎?

回答

0

pgref -f(您正在使用)不匹配模式進程的整個命令行,而不僅僅是進程名。這就是說,你可以使用:

arg="foo" 
pgrep -f "theOneFile.pl.*${arg}" 

嗯,pgrep方法是容易出現競爭情況。更好的辦法是將腳本本身改爲使用exclusive lock - 每個參數。