如果Linux进程使用给定参数运行,则通过Shell脚本确定

时间:2017-10-19 14:54:15

标签: linux bash shell cron

我工作的公司设置了一个crontab,每隔几分钟就会运行一个给定的Shell脚本来执行某些复杂的操作,而无需用户使用'介入。这个脚本基本上按序列执行多个Perl脚本,首先检查它们是否已经运行,使用以下结构的次数与客户一样多次:

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

这种作品,除了现在有几十个" ourFile"我们的/path/to/the/script文件夹中的Perl脚本,它们是彼此的精确副本!每当新客户上线时,我们都需要创建一个新的副本,这使得维护这个结构非常难以说清楚。

我试图让这个结构在一个文件(在这里命名为[theOneFile.pl])上运行,这个文件是这些脚本的另一个副本,但每次都使用一个新参数调用。这有效,但现在我必须确保每次传递参数时我只运行一次这个文件。

经过一些研究,并感谢This answer,我已经成功地确定了通过pgrep -af theOneFile.pl | tr '\000' ' '| awk '{print $4}' >> $LOG运行[theOneFile.pl]背后的论点。但是,这给了我一个内容结果列表。为了保持今天的逻辑尽可能完整,我试图确定这些进程中是否有一个在给定时间运行了一个特定的参数(例如,theOneFile.pl 10000009),但是我&# 39;我不知道该怎么做。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

pgref -f(您正在使用)确实将模式与流程的整个命令行匹配,而不仅仅是流程名称。也就是说,您可以使用:

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

嗯,pgrep方法很容易出现竞争条件。更好的方法是更改​​脚本本身以使用exclusive lock - 每个参数。