我的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 版本。
当前版本的ps
from 会在没有警告的情况下procps-ng
解释x
带有或不带有破折号的选项; CentOS 6 中旧版本的ps
fromprocps
添加了一个警告(但它仍然列出了所有进程,因此您grep
应该找到它正在寻找的进程(如果存在)。这行为尽管在两个版本中有所不同,但ps -xef
输出命令及其环境;如果你想保留这个,你可以放弃警告:
ps -xef 2>/dev/null
这适用于旧版本和新版本的ps
fromprocps
和procps-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 是完全正确的,我相信会对你有用。