【问题标题】:Getting User from processid when multiple user processes exist存在多个用户进程时从 processid 获取用户
【发布时间】:2019-08-12 21:05:25
【问题描述】:

当有多个应用程序作为 masterId 运行时,我正在尝试调整 bash 脚本以拉回各个应用程序帐户的 PID。这曾经在个人用户帐户下运行,但最近的更改迫使应用程序全部在组合的“masterId”下运行,但仍保持一个唯一的应用程序 ID,我可以对其进行 grep。

正常

pgrep -u "appId" 

会给我一个 PID。现在我必须运行:

pgrep -u "masterId"

它返回所有的 PID(每一个都是它自己的应用程序)。

1234
2345
3456

我试图想出一个命令来让我只返回 appAccount(n) 的 PID,这样我就可以将它传递给其他有用的命令。我可以做一个双重grep(这更接近我想要的):

ps aux | grep -i "masterId" | grep -i "appAccount(n)"

这将为我提供整个单个进程信息,但我只想让 PID 执行以下操作:

ps aux | grep -i "masterId" | grep -i "appAccount(n)" | xargs sudo -u appAccount(n) kill -9

如何修改上述初始命令以仅获取 PID?有没有更好的方法来做到这一点?

【问题讨论】:

  • 请发布ps aux | grep -i "masterId" | grep -i "appAccountA" 命令的输出。还有pgrep -l 开关。您可以使用awk 从流中过滤特定索引,例如awk '{print $3}' 将为您提供输入行的第三列。
  • 我不明白;在第二种情况下,appAccount(n) 字符串是命令行的一部分吗?它的第一个论点?进程名称?别的东西? pgrep -u masterId -if 'appAccount\(n\)' 应该可以,但是你的 Q 太模糊了,很难说。

标签: linux bash grep pid


【解决方案1】:
pgrep --euid "masterId" --list-full | awk '/appAccount(n)/ {print $1}'

输出完整的进程命令行,然后选择具有所需帐户的命令行并打印第一个字段(pid)。

【讨论】:

  • awk(就像pgrep btw)正在使用扩展的正则表达式; /appAccount(n)/ 不会匹配您认为匹配的内容。而那种ps | grep | sed | awk 管道总是是一个可怕的想法。
  • @mosvy:我将 OP 的“appAccount(n)”解释为占位符,而不是精确的正则表达式。我没有在 pgrep 命令中使用正则表达式 - 我使用的是 uid 选择器。我的管道不是“ps | grep | sed | awk”。它有两个部分——其中之一是pgrep,但它也可以很容易地成为ps。一个或另一个必须在那里。
  • 不,您可以在一个 pgrep 命令中完成所有这些操作。请参阅我对 Q 的评论。但尚不清楚 appAccount(n) 是命令行的一部分还是进程/线程名称 (/proc/PID/comm)。
  • @mosvy:对不起,我有--list-full 选项,所以我错过了它可以使用两个标准并且只输出pid 的事实。感谢您的澄清。
  • @Dennis Williamson,你是对的。 appAccount(n) 代表“在该 masterId 下运行的任何应用程序标识符”。
猜你喜欢
  • 2016-03-23
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多