我有一个命令:
ps ax | grep my_application
如果my_application未运行,则输出一个包含涉及此应用程序进程端口的大字符串。
3873 pts/0 S+ 0:00 grep my_application
我需要一个条件来测试
ps ax | grep my_application
的输出,并在 my_application 仍在运行时执行 exit 2
。有任何想法吗?您可以添加括号来排除grep进程:
ps ax | grep -q '[m]y_application' && exit 2
ps ax
将打印 my_application 以及 grep 命令和模式。Grep 将 [m]
理解为一个字符类,但不会匹配由 ps ax
打印的字面字符串 '[m]'
,因此 grep 进程被排除在外。如果您的系统支持,最简单的解决方案是使用pgrep
。
否则,您可以自定义ps
报告进程的方式。您不必使用默认格式,其中包括(某些)命令行参数。
例如:
ps ax -ocomm
仅输出可执行文件名。如果您还想要进程 ID (PID),
ps ax -opid,comm
为了方便使用grep命令,你可能想要删除标题。
ps ax -opid=,comm=
grep 应用程序名称
的输入,尽管您仍需要注意应用程序名称
是否是另一个应用程序名称的子字符串。
man ps
应该给您可能输出字段的列表。有很多选项。您可以通过使用类似以下命令来从grep返回的结果中排除某些内容:
ps ax | grep my_application | grep -v grep
这不包括在应用程序未运行时显示 grep 运行的返回过程。当此过程运行且您的应用程序未运行时,它将返回空值。检查空字符串并以此方式退出。
[m]y_application
作为模式,这样它就不会在ps
的输出中匹配自身。 - chepner
pgrep
,您可以使用它。 - anubhavaps ax | grep my_application
命令的输出产生两行或更多行,则表示该进程当前正在运行,否则它没有运行。 - Avinash Raj