ps 在特定版本的 Linux 上不支持 -x 标志

ps 在特定版本的 Linux 上不支持 -x 标志

我的ps命令除了在 Linux 上的特定版本外都有效,如下所示。

[root@failinghost ~]# ps -xef | grep -v grep | grep websphere
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

[root@failinghost ~]# ps -version
ERROR: Unsupported SysV option.
********* simple selection *********  ********* selection by list *********
-A all processes                      -C by command name
-N negate selection                   -G by real group ID (supports names)
-a all w/ tty except session leaders  -U by real user ID (supports names)
-d all except session leaders         -g by session OR by effective group name
-e all processes                      -p by process ID
                                      -q by process ID (unsorted & quick)
T  all processes on this terminal     -s processes in the sessions given
a  all w/ tty, including other users  -t by tty
g  OBSOLETE -- DO NOT USE             -u by effective user ID (supports names)
r  only running processes             U  processes for specified users
x  processes w/o controlling ttys     t  by tty

*********** output format **********  *********** long options ***********
-o,o user-defined  -f full            --Group --User --pid --cols --ppid
-j,j job control   s  signal          --group --user --sid --rows --info
-O,O preloaded -o  v  virtual memory  --cumulative --format --deselect
-l,l long          u  user-oriented   --sort --tty --forest --version
-F   extra full    X  registers       --heading --no-heading --context
                                      --quick-pid

                    ********* misc options *********
-V,V  show version      L  list format codes  f  ASCII art forest
-m,m,-L,-T,H  threads   S  children in sum    -y change -l format
-M,Z  security data     c  true command name  -c scheduling class
-w,w  wide output       n  numeric WCHAN,UID  -H process hierarchy

[root@failinghost ~]# ps -V
procps version 3.2.8

[root@failinghost ~]# uname -a
Linux failinghost 2.6.32-754.28.1.el6.x86_64 #1 SMP Fri Jan 31 06:05:42 EST 2020 x86_64 x86_64 x86_64 GNU/Linux

下面是另一台 Linux 主机,幸运的是我没有收到错误:

[root@workinghost ~]$ ps -xef | grep -v grep | grep websphere

[root@workinghost ~]$ echo $?
1

[root@workinghost ~]$ uname -a
Linux workinghost 3.10.0-1062.1.2.el7.x86_64 #1 SMP Mon Sep 16 14:19:51 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux

[root@workinghost ~]$ ps -V
procps-ng version 3.3.10

我希望我的 ps 命令能够在所有非 Solaris 上运行。

您能否建议一个适用于两个 Linux 版本的解决方案?

答案1

您可能不需要x-e就足以选择所有进程:

ps -ef

这应该适用于ps您可能遇到的任何 Linux 版本。

当前版本的psfrom 会在没有警告的情况下procps-ng解释x带有或不带有破折号的选项; CentOS 6 中旧版本的psfromprocps添加了一个警告(但它仍然列出了所有进程,因此您grep应该找到它正在寻找的进程(如果存在)。这行为尽管在两个版本中有所不同,但ps -xef输出命令及其环境;如果你想保留这个,你可以放弃警告:

ps -xef 2>/dev/null

这适用于旧版本和新版本的psfromprocpsprocps-ng

答案2

它可能会抱怨,因为x看起来是什么联机帮助页称为“BSD 选项”,因此,它不应该带有破折号(即,它是x,而不是-x)。无论如何,这-x似乎并不存在,所以谁知道它是如何解释的。也许作为 的同义词-x,这似乎是在例如当前的 FreeBSD ps

我也不太确定该组合会做什么或应该做什么。在我的系统(Debian,ps from procps-ng 3.3.12)上,它以树的形式列出了进程,尽管那里的选项似乎都没有表明:

  PID TTY      STAT   TIME COMMAND
12277 ?        S    119:08 mosh-server new ...
12278 pts/20   Ss     0:00  \_ -bash ...
12286 pts/20   S+     0:01      \_ screen -xU

如果您只想从中 grep 出一行,则可能不需要树输出。

答案3

3.2.8 至少有 9 年历史,并且比当前版本落后许多版本。

问题是 - 将其设置为一种模式,但 x 是一种不同的模式,并且它对您想要的模式感到困惑。我认为我们在 2012 年发布的 3.3.4 中修复了这个问题(通过让它不那么关心,所以严格来说不太正确,但更符合用户的期望)。

ps xef 是完全正确的,我相信会对你有用。

相关内容