我有命令:
ps ax | grep my_application
哪个输出一个大字符串,包括my_application中涉及的proccesses的端口。
如果my_application未运行,则输出:
3873 pts/0 S+ 0:00 grep my_application
我需要一个条件来测试ps ax | grep my_application
的输出,并在my_application仍在运行时执行exit 2
。
有什么想法吗?
答案 0 :(得分:5)
您可以添加括号以排除grep进程:
ps ax | grep -q '[m]y_application' && exit 2
如果my_application正在运行,ps ax
将打印my_application以及grep命令和模式。 Grep将[m]
理解为字符类,但它与'[m]'
打印的文字字符串ps ax
不匹配,因此不包括grep进程。
答案 1 :(得分:1)
最简单的解决方案是使用pgrep
,如果它在您的系统上可用。
否则,您可以自定义ps
报告流程的方式。您不必使用默认格式,其中包括(某些)命令行参数。
例如:
ps ax -ocomm
只会输出可执行文件名。如果你也想要pids,
ps ax -opid,comm
为方便点击,您可能需要删除标题
ps ax -opid=,comm=
其中任何一个都应该可以正常作为grep application_name
的输入,尽管您仍然需要注意application_name
是另一个应用程序名称的子字符串。
man ps
应该为您提供可能的输出字段列表。它们很多。
答案 2 :(得分:0)
您可以使用以下内容从grep返回的结果中排除内容:
ps ax | grep my_application | grep -v grep
这排除了当您的应用程序未运行时返回的进程,该进程显示grep正在运行。当它运行并且您的应用程序未运行时,它将不返回任何内容。检查空字符串,然后退出。