0

My ps command works except on a particular version on Linux as you can see below.

[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

Below is another Linux host where I thankfully don't get the error:

[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

I wanted my ps command to work on all non-Solaris.

Can you please suggest a solution that works on both the Linux versions?

Ashar
  • 491
  • Note the subtle difference between "procps" and "procps-ng". This is most likely distribution dependent. – Thorbjørn Ravn Andersen Aug 06 '20 at 08:29
  • But how does it fail? Does ps -xef have no output? Do all of its output lines contain the string grep? Does its output just not include websphere? More importantly, why aren't you using pgrep? – terdon Aug 06 '20 at 08:55

3 Answers3

1

You might not need x, -e is sufficient to select all processes:

ps -ef

This should work on any version of ps on Linux you’re liable to come across.

Current versions of ps from procps-ng interpret the x option with or without a dash without warning; the older version of ps from procps in CentOS 6 adds a warning (but it still lists all the processes, so your grep should find the processes it’s looking for, if they are present). The behaviour is different though in both versions, ps -xef outputs the command and its environment; if you want to keep this, you can discard the warning:

ps -xef 2>/dev/null

This works with older and newer versions of ps from procps and procps-ng.

Stephen Kitt
  • 434,908
1

It probably complains because x appears to be what the manpage calls a "BSD option" and as such, it shouldn't take a dash (i.e., it's x, not -x). Not that -x seems to exist anyway, so who knows how it interprets that. Maybe as a synonym for -x, which is what appears to be in e.g. current FreeBSD ps.

I'm also not exactly sure what that combination does or should do. On my system (Debian, ps from procps-ng 3.3.12) it lists the processes as a tree, even though none of the options there seem to indicate that:

  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

You probably don't need the tree output if you're going to just grep a single line out of it.

ilkkachu
  • 138,973
  • I was also going to suggest just using ps -C websphere if you're looking for a process with that name, but on my other system, that also stops printing the full command line, whatever columns I ask for with -o. And I still don't get what turns the tree-type output on. I think I hate that program. – ilkkachu Aug 06 '20 at 08:44
  • Don't let the procps manual mislead you. These are not the options from BSD ps. The BSD ps option has been -x since 1990. https://unix.stackexchange.com/a/511530/5132 http://jdebp.uk./Softwares/nosh/guide/commands/ps.xml#HISTORY All of this is procps's own confusion and complexity. – JdeBP Aug 06 '20 at 11:27
  • @JdeBP, yeah, great. – ilkkachu Aug 06 '20 at 11:43
0

3.2.8 is at least 9 years old and many versions behind the current version.

The issue is that the - sets it to one mode but the x is a different mode and its confused about which one you want. I think we fixed this (by making it care less, so strictly less correct but more what users expect) in 3.3.4 released in 2012.

ps xef is strictly correct and will work for you I believe.