看来我错过了一些非常明显的东西,但仍然:
ps -f -u myuser --ppid 1
似乎只查看进程的父 pid,并返回父 pid 为 1 的所有进程 - 即使用户不是myuser
。
单独-u
工作正常(仅选择 的进程myuser
):
ps -f -u myuser
我缺少什么?是否有一些内置方法可以按多个条件进行过滤ps
?
编辑: 我当前的解决方法:
ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))
答案1
ps
那样很烦人。幸运的是,有pgrep
,它有类似的选择选项,但要求它们全部匹配,然后输出匹配的 pid。默认情况下,它每行输出一个,但可以要求使用不同的分隔符,以便它可以使用ps
:
ps -f -p"$(pgrep -d, -u $USER -P 1)"
答案2
不幸的是ps
只能取消选择,似乎没有and
操作员或添加细化的能力。
您可以寻求帮助来pgrep
获取 PID 列表并将其提供给ps
您。例如:
$ ps -f $(pgrep -P 1 -u saml)
UID PID PPID C STIME TTY STAT TIME CMD
saml 1986 1 0 Jul25 ? SLl 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
saml 2003 1 0 Jul25 ? S 0:00 dbus-launch --sh-syntax --exit-with-session
saml 2004 1 0 Jul25 ? Ss 0:23 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
saml 2147 1 0 Jul25 ? S 0:04 /usr/libexec/gconfd-2
saml 2156 1 0 Jul25 ? Ssl 0:09 /usr/libexec/gnome-settings-daemon
saml 2162 1 0 Jul25 ? S 0:00 /usr/libexec/gvfsd
saml 2178 1 0 Jul25 ? Ssl 0:01 /usr/bin/pulseaudio --start --log-target=syslog
saml 2180 1 0 Jul25 ? Ssl 0:04 /usr/libexec//gvfs-fuse-daemon /home/saml/.gvfs
saml 2191 1 0 Jul25 ? S 0:12 syndaemon -i 0.5 -k
saml 2193 1 0 Jul25 ? S 0:00 /usr/libexec/gvfs-gdu-volume-monitor
答案3
ps
没有非常灵活的过滤器。使其显示的内容超出您的需要,明确指定格式并过滤输出。 awk 通常可以很好地完成此任务。
ps -o pid= -o ppid= -o user= -o comm= -o args= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid'
列名称后面的等号抑制标题行。如果您想查看标题行,请使过滤器打印出第一行不变:
ps -o pid -o ppid -o user -o comm -o args |
awk -v uid="$(id -un myuser)" 'NR == 1 || ($2 == 1 && $3 == uid)'
如果您想要进行一些自动化处理,则需要将数据精简为仅 PID。
ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'
答案4
我必须检查我的批处理启动的 PID,所以我必须检查 PID 和 PPID,这个 grep 对我来说更有用:
grep -c $$ /proc/CHILDPID/stat