如何仅获取特定进程的用户、pid 和运行的命令?(Ubuntu 11.10)

如何仅获取特定进程的用户、pid 和运行的命令?(Ubuntu 11.10)

当我这样做时,ps -ef|grep python我得到以下信息:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

我如何只获取用户谁在运行该过程,进程号命令按照以下输出运行该过程?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d

答案1

我猜你正在寻找 -o 参数:

-o 格式:

用户定义的格式。格式是一个以空格分隔或逗号分隔的列表形式的单个参数,它提供了一种指定单个输出列的方法。可识别的关键字在下面的标准格式说明符部分中描述。可以根据需要重命名标题(ps -o pid,ruser=RealUser -o comm=Command)。如果所有列标题都为空(ps -o pid= -o comm=),则不会输出标题行。列宽将根据需要增加以适应宽标题;这可用于加宽 WCHAN 等列(ps -o pid,wchan=WIDE-WCHAN-COLUMN -o comm)。还提供显式宽度控制(ps opid,wchan:42,cmd)。ps -o pid=X,comm=Y 的行为因人而异;输出可能是一个名为“X,comm=Y”的列或名为“X”和“Y”的两列。如有疑问,请使用多个 -o 选项。使用 PS_FORMAT 环境变量根据需要指定默认值;DefSysV 和 DefBSD 是可用于选择默认 UNIX 或 BSD 列的宏。

因此您需要的命令是(Ubuntu):

ps -o uid,pid,cmd -ef|grep python

在 OpenSolaris 下,命令是:

ps -o ruser,pid,comm -ef|grep python

答案2

最简单的可能是:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

这样,您就可以直接获取所有内容ps,而不需要解析任何内容。

ps手册页中:

-o format

用户定义的格式。format 是一个以空格分隔或逗号分隔的列表形式的单个参数,它提供了一种指定各个输出列的方法。[...] 可以根据需要重命名标题(ps -o pid,ruser=RealUser -o comm=Command)。 如果所有列标题都为空(ps -o pid= -o comm=),则不会输出标题行。

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

-C如果您以交互方式运行,则此选项将起作用python,而如果 python 正在运行脚本,则此选项不起作用。在这种情况下,您应该使用-C scriptname.py

答案3

ps -eo user,pid,cmd | grep [p]ython

例子:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
user     16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

解释:

  • -e所有流程
  • -o用户定义格式
  • user,pid,cmd显示用户、进程ID、命令列

笔记:如果您按照其他人的建议使用-fwith -o,则可能会出现错误。这是因为这两个参数都控制输出格式,因此只能使用其中一个:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal

答案4

我的 PS 版本不同,因此可能需要进行一些调整,但您可以使用 cut(也可能使用 tr,具体取决于您想要实现的目标)-例如

ps ef | 切割 -c1-16,50-   

将从 ps 语句的每一行提供 1-16 和 50 及以后的字符。(您的实际数字可能需要一些调整)。

另一种方法(但格式会丢失)可能是

ps ef | tr -s“”| cut -f1,2,8- -d“”

这将压缩 ps 命令中的空格,然后取出字段 1、2 和 8 以及后续字段并显示它们。

相关内容