检查脚本是否正在运行

检查脚本是否正在运行

我有一个作业 test.sh 计划每 5 分钟运行一次,另一个作业 test1.sh 计划在 12.30pm 运行,@12.30 这两个作业都将运行并陷入死锁。所以我需要检查我正在使用的作业 test.sh 正在运行:

ps -ef | grep test1.sh

但这似乎总是正确的,因为它为同一命令生成一行。

  # ps -ef | grep test1.sh
team 24896   607  0 11:55 pts/11   00:00:00 test1.sh
team 24925   523  0 11:55 pts/4    00:00:00 grep test1.sh

如何避免打印 grep test1.sh

我对unix很陌生。

谢谢,安

答案1

如果您只是想查看它是否正在运行而不是通过管道ps输出,grep您可以使用pgrep.这样只会输出进程的PID,效率高很多。我正在使用该-x标志,以便它与 test1.sh 进行完全名称匹配

pgrep -x test1.sh
876

如果您还想查看命令名称,也可以使用该-l标志。

pgrep -xl test1.sh
876 test1.sh

如果你想进行部分匹配,你可以删除-x

pgrep -l test
876 test1.sh
877 test2.sh
888 test123.sh
8745 test.bin

答案2

您可以通过以下一项一项来忽略 grep:-

ps -ef | grep test1.sh | grep -v grep

别的:-

ps -ef | grep "[t]est1.sh"

第二个看起来很下降,可以节省很多时间。

答案3

发生这种情况是因为grepps是并行启动的,因此该grep过程是匹配的,因为目标字符串test1.sh作为其参数出现在 中ps。绕过这个问题的一个简单但可能不是最佳的方法是:

ps -ef | grep "test1.sh" | grep -v "grep"

第二个管道获取第一个管道的输出,并排除包含字符串“grep”匹配的行。

相关内容