如何仅让用户,pid和命令针对特定进程运行?(Ubuntu 11.10)


19

当我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

如何仅获得正在运行该进程的用户pid和为该进程运行的命令,如以下输出所示?

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

这样行吗?ps --fields="user pid command"
普拉塔纳拉

没有尝试。在网上找到它。现在不在Ubuntu机器附近。抱歉。稍后再见,让您知道
pratnala

不,我收到错误消息:未知gnu long选项。对你起作用吗?
Bentley13年

Answers:


13

我猜您正在寻找-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

3
这实际上对您有用吗?当我运行该命令时,我会得到Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4 2013年

是的,它在OpenSolaris下的ksh中对我有用。输出如您所愿...在系统上查看ps的手册页man ps。也许语法在您的系统上略有不同。
西蒙

1
但是,OP受到
打击

1
@ Bentley4如果只需要该命令,不需要其他信息,则可以删除-f参数并使用以下命令:ps -o uid,pid,cmd -e|grep python
Simon

1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon

3

最简单的可能是:

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

这样,您可以直接从中获取所有内容,ps而无需解析任何内容。

ps手册页:

-o格式

用户定义的格式。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改用。


1

我的PS版本有所不同,因此可能需要进行一些调整,但是您可以使用cut(也可以根据您要实现的目标而使用tr)-例如

ps ef | 切-c1-16,50-   

从ps语句的每一行开始将提供字符1-16和50。(您的实际数字可能需要一点按摩)。

另一种方法(但您将失去格式)可能是

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

它将在ps命令中压缩空格,然后从字段1,2和8开始并显示它们。


仅使用一个过程,使用这些命令就可以在全屏上获得半页的信息。这是非常难以理解的,我正在“按摩”参数,但是到目前为止,我还无法远程获得想要的任何东西。
Bentley4年

1
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
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

说明:

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

注:如果您使用-f-e如其他人所说,你可能会得到错误。这是因为这两个参数都控制输出格式,并且只能使用其中一个:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.