标志为'ps'命令,可以过滤参数?


2

我知道可以过滤命令的参数“-C”。

但在我的场景中,我可能有一些具有相同进程名称和不同args的进程。

如何过滤这些args?

(我知道我可以稍后管道,但这不是100%准确。即:当一个arg可能包含另一个arg时,例如,如果我想通过这些列表中的arg“bar”进行过滤:

+---------+---------+-----------+
| Process | Command | Arguments |
+---------+---------+-----------+
| 23      | foo     | bar       |
| 48      | foo     | barbaz    |
+---------+---------+-----------+

PS:我猜大多数答案都会建议我使用“pgrep”代替“ps”,但我想尽可能避免这种情况。

Answers:


1

我认为你不能ps单独使用它。过滤使用grep并不理想,但如果您愿意给出pgrep机会,那么您可以非常接近您的要求:

ps -p $(pgrep -f bar -d',')

-f选项使pgrep搜索完整命令行(而不仅仅是进程名称),而该-d选项指定用于将pid串在一起的分隔符。

传递pid列表ps会将输出限制为包含完整命令中关键字的输出(包括参数)。

在您想要匹配“foo bar”但不匹配“foo barbaz”的示例中,您搜索与以下内容完全匹配:

ps -p $(pgrep -f "foo bar$" -d',')   # Note the eol anchor '$'

为什么你在同一行提出pgrep和ps?不能pgrep作为独立的罚款?

你提到你热衷于使用ps而不是pgrep那么我正在假设你需要一些pgrep无法提供的选项。因此我的例子pgrep仅用于缩小PID的范围ps。如果您只需要PID,请忽略该ps位。
Shawn Chin 2013年

好吧,我可能会给pgrep一个去,但是如何指定EOL作为-d标志的值?

2

我不相信存在这样的选择 - 至少在我的版本中不存在ps。我怀疑那里的许多ps实现都有这样一个选项 - 命令名称非常直接定义,当它归结为命令参数时绝对不是这种情况。

在任何情况下,Unix哲学都是链接许多简单的工具(例如psgrep)来执行更复杂的任务。有人可能会争辩说即使ps -C是推动它 - 事实上我相信MacOS X ps没有这样的选择。

你究竟想做什么?你问题的背景是什么?因为,根据我的经验,在99%的人们通过解析输出来自动化东西的情况下,ps无论他们做错了什么......


我需要在部署前提取应用程序的PID,然后在部署后将其删除(我这样做是因为如果想要在执行Kill操作时进行过滤,我猜它会更难,因为我会需要按创建时间排序流程)。我需要通过args进行过滤,因为如果不这样做,我可能会杀死在同一服务器上运行的其他应用程序,在同一个用户下,但使用不同的args。

我已经解释了为什么我不喜欢grep选项

@knocte:在类Unix系统上执行此操作的标准方法是让启动程序脚本在启动进程后将服务器PID 存储在文件中。任何其他解决方案都容易失败.​​..
thkala 2013年

...某些程序还提供了自己创建PID文件的选项,通常包括在终止时处理它的删除。
thkala 2013年

1
@knocte:好吧,在bash启动器脚本中你可以使用$?$!特殊参数。你是如何启动流程的?
thkala 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.