通过Shell脚本确定Linux进程是否在给定参数下运行

问题描述:

我工作的公司有一个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)一个特定参数运行这些程序之一,但我不知道该怎么办所以。有任何想法吗?

pgref -f(您正在使用)不匹配模式进程的整个命令行,而不仅仅是进程名。这就是说,你可以使用:

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

嗯,pgrep方法是容易出现竞争情况。更好的办法是将脚本本身改为使用exclusive lock - 每个参数。