在 Linux 中,我使用ps -C command_name
它来选择指定命令名称的进程。但它在 Mac OS X 中不起作用。我仔细阅读了 ps 的手册页,但就是找不到任何选项来执行此操作。
那么有人知道在 Mac OS X 中使用 ps 时是否有办法通过命令名称选择指定的进程吗?
答案1
在一般情况下,如果不使用 grep 作为辅助或通过管道/shell 连接到第二个 linux 命令来提供帮助,似乎无法真正做到这一点。如果您尝试通过从其他语言(例如 Java)启动进程来执行此操作,则可能需要避免使用任何 shellisms,因此需要用一个命令来执行此操作。因此请考虑程序包作为替代方案。例如,列出所有 java 进程:
pgrep java
答案2
过滤输出的一个简单方法ps
是使用通常可以过滤输入的工具grep
。
为了做到这一点,我们只需管道将 的输出ps
放入 grep 中,如下所示:
oliver@cloud:~$ ps | grep bash
31131 pts/0 00:00:00 bash
如果你要列出全部流程,你很快就会遇到一个问题:
oliver@cloud:~$ ps a | grep bash
2729 pts/0 S+ 0:00 grep bash
31131 pts/0 Ss 0:00 -bash
现在它grep
自己也回来了!我们该如何修复它?
只需使用grep
再次,过滤掉多余的结果:
oliver@cloud:~$ ps a | grep bash | grep -v grep
31131 pts/0 Ss 0:00 -bash
答案3
<- OSX -> 通过匹配二进制文件(又名命令名称)来获取名为 Humans 的正在运行的二进制文件的 PID。
helios:~TimberWolf$ killall -s 人类
-> 仅数字
helios:~TimberWolf$ killall -s Humans | tr -d [:alpha:][:space:]-
-> 使用 PID 和 ps 命令来获取更精细的细节,例如二进制的优先级。
helios:~TimberWolf$ pskillall -s Humans | tr -d [:alpha:][:space:]-
答案4
我也遇到过同样的问题。这是一个解决方案,但并不完全令人满意:
ps -p `pidof <command_name> | tr ' ' ','`
这并不总是有效(例如当命令名称实际上是对解释器的调用时),而且它相当丑陋。我希望它可以提供想法并产生更好的解决方案!