进程快照格式的完整用户名

进程快照格式的完整用户名

我正在尝试获取 PM2 使用情况的进程快照

bitrix    1948  4.0  0.9 1586136 748292 ?      Ssl  Apr09 426:12 PM2 v5.2.2: God Daemon (/home/bitrix/.pm2)

经过

ps waxfu | grep "[P]M"

但也会得到以...开头的行

usern+

我已经尝试过user:[length]但是没有得到error: unsupported option (BSD syntax)

我想获取每个 PM2 进程,然后获取其全长用户名,以便使用该用户名runuser -l $user -c "pm2 list"

如何解决这个问题?

username1    1948  4.0  0.5 1282136 401776 ?      Ssl  Apr09 439:05 PM2 v5.2.2: God Daemon (/home/username1/.pm2)
userna+  1954  0.0  0.0 901844 18312 ?        Ssl  Apr09   0:04 PM2 v5.2.0: God Daemon (/home/username2/.pm2)
use+ 20428  0.0  0.0 706176 27384 ?        Ssl  Apr15   0:01 PM2 v5.2.2: God Daemon (/home/username3/.pm
root     12857  0.0  0.0 630240 15808 ?        Ssl  07:33   0:00 PM2 v5.2.2: God Daemon (/root/.pm2)

答案1

不幸的是,pgrep不会列出未连接到 TTY 的进程的 ID。这就是我之前发布的方法不适合您的原因(我将在下面介绍,供没有这种要求的人使用)。

我找不到比这个烂摊子更好的东西来实现你所追求的目标,希望其他人能够加入进来,并发布一种以更干净的方式做到这一点的方法:

ps waxfo user:100=,command= | awk '/PM2/ {print $1}'

此外,虽然没有要求,但可能需要过滤掉可能的重复用户(以防其中一些用户正在运行 PM2 的多个实例):

ps waxfo user:100=,command= | awk '/PM2/ {print $1}' | sort -u

我删除了该u选项,并将其替换为该o user:100=,command=选项,以避免截断长达 100 个字符的用户名,并减少输出中的列数,尽可能防止冲突,并且出于同样的原因,我用PM2(交换grepawk,以便能够同时过滤掉除第一个之外的其他字段)替换了该模式。sort -u将过滤掉可能的重复用户。


根据评论,如果我理解正确的话,除非目标进程没有连接到 TTY

ps -o user= -p $(pgrep PM2)

将查找每个进程,包括PM2进程名称,并打印每个匹配项的所有者的用户名。

  • $(pgrep PM2)PM2:返回包含进程名称的PID 列表
  • -o user=:将输出格式设置为单个“用户”列,丢弃标题
  • -p:根据 PID 列表过滤进程

例如,我的用户名是“user”,有 5 个zsh进程正在运行。

如果我运行ps -o user= -p $(pgrep zsh)

user@[REDACTED] ~ % ps -o user= -p $(pgrep zsh)
user
user
user
user
user

答案2

您的问题不清楚,但如果您的问题中有以下这段文字:

$ cat file
username1    1948  4.0  0.5 1282136 401776 ?      Ssl  Apr09 439:05 PM2 v5.2.2: God Daemon (/home/username1/.pm2)
userna+  1954  0.0  0.0 901844 18312 ?        Ssl  Apr09   0:04 PM2 v5.2.0: God Daemon (/home/username2/.pm2)
use+ 20428  0.0  0.0 706176 27384 ?        Ssl  Apr15   0:01 PM2 v5.2.2: God Daemon (/home/username3/.pm
root     12857  0.0  0.0 630240 15808 ?        Ssl  07:33   0:00 PM2 v5.2.2: God Daemon (/root/.pm2)

旨在作为示例输入(命令的输出),并且您想要打印以 开头并包含 的ps每一行的第一个字段,那么这将是(使用代替您的命令只是为了演示 awk` 命令):usernPM2cat fileps

$ cat file | awk '/^usern/ && /[P]M2/ { print $1 }'
username1
userna+

如果您只想打印唯一的用户名,则将 awk 脚本更改为:

awk '/^usern/ && /[P]M2/ && !seen[$1]++ { print $1 }'

如果这不是您想要做的,那么请编辑您的问题以澄清您的要求并提供简洁、可测试的示例输入和预期的输出,因为该输入说明了这些要求,我们可以复制/粘贴进行测试。

相关内容