我工作的公司设置了一个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;我不知道该怎么做。有什么想法吗?
答案 0 :(得分:0)
pgref -f
(您正在使用)确实将模式与流程的整个命令行匹配,而不仅仅是流程名称。也就是说,您可以使用:
arg="foo"
pgrep -f "theOneFile.pl.*${arg}"
嗯,pgrep
方法很容易出现竞争条件。更好的方法是更改脚本本身以使用exclusive lock - 每个参数。