我有一个作业 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
发生这种情况是因为grep
和ps
是并行启动的,因此该grep
过程是匹配的,因为目标字符串test1.sh
作为其参数出现在 中ps
。绕过这个问题的一个简单但可能不是最佳的方法是:
ps -ef | grep "test1.sh" | grep -v "grep"
第二个管道获取第一个管道的输出,并排除包含字符串“grep”匹配的行。