我正在尝试获取 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
(交换grep
为awk
,以便能够同时过滤掉除第一个之外的其他字段)替换了该模式。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` 命令):usern
PM2
cat file
ps
$ cat file | awk '/^usern/ && /[P]M2/ { print $1 }'
username1
userna+
如果您只想打印唯一的用户名,则将 awk 脚本更改为:
awk '/^usern/ && /[P]M2/ && !seen[$1]++ { print $1 }'
如果这不是您想要做的,那么请编辑您的问题以澄清您的要求并提供简洁、可测试的示例输入和预期的输出,因为该输入说明了这些要求,我们可以复制/粘贴进行测试。