当我这样做时,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、命令列
笔记:如果您按照其他人的建议使用-f
with -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 以及后续字段并显示它们。