ps aux | grep nginx is one of the most-typed commands in existence, and it is a slightly embarrassing one: two commands, a pipeline, and a result that always includes the grep itself. procs replaces it with procs nginx, and adds the columns you would otherwise go looking for in three other tools.

The short verdict. A small, pleasant improvement rather than a revelation — install it on your own machine and enjoy the searching and the port column, but this is the least essential tool on this page. ps is on every system, its output format is stable enough to parse, and ps aux is a phrase every Linux person on earth understands. Never put procs in a script.

What it changes

psprocs
Finding one processps aux | grep nameprocs name
OptionsTwo incompatible sets, BSD and UNIXOne, with long names
Listening portsNot shown — use ssA column
Container nameNot shownA column, when Docker is running
Tree viewps -ejH, or pstree--tree
Live updatesNo — use top--watch
ColourNoneBy state and by resource use
Output stabilitySpecified, scriptableNot promised — do not parse it

The ports column is the genuinely new thing. “Which process is listening on 8080” normally means ss -tlnp and then matching a PID by eye; here it is already beside the process.

Installing it

sudo apt install procs        # Debian, Ubuntu
sudo dnf install procs
sudo pacman -S procs
cargo install procs           # anywhere
procs --version

No naming traps for once — the package and the command are both procs. One thing to know: the sockets belonging to other users are only visible to root, so without sudo the ports column is populated for your own processes and blank for everything else. That looks like a bug and is not.

Translating what you already do

psprocs
ps auxprocs
ps aux | grep nginxprocs nginx
ps -p 1234procs 1234
ps -u aliceprocs --or user:alice
ps aux --sort=-%cpu | headprocs --sortd cpu
ps aux --sort=-rss | headprocs --sortd mem
ps -ejH / pstreeprocs --tree
watch 'ps aux | grep x'procs --watch x
ss -tlnp | grep 8080procs --or port:8080

A bare search term matches against the command, the name and the PID at once, which is why procs 1234 and procs nginx both do the obvious thing. For anything more precise, the keyword:value form filters on a specific column, and --and / --or combine several.

--tree is worth a mention of its own. Seeing that eleven processes are children of one supervisor — rather than eleven unrelated rows — is often the entire answer to “why are there so many of these”.

Where ps is still the right answer

  • Every script. ps -o pid=,comm= produces exactly the fields you asked for, in a documented format, on every Unix. procs makes no such promise and its columns change between versions. Parsing it is building on sand.
  • Servers and containers. Not installed, and the moment you need it is rarely the moment to be installing things.
  • Selecting precise fields. ps -eo pid,ppid,etimes,rss,args --sort=-rss — elapsed seconds, resident memory, whatever you want, in that order. procs is not built for this.
  • Anything about threads. ps -eLf shows them; procs is process-oriented.
  • When you need ps‘s exactness. The STAT column’s flags — D for uninterruptible sleep, Z for a zombie, + for the foreground group — are precise, documented and diagnostic.

It is also worth being clear about what this tool is not. procs takes a snapshot, like ps. For watching a machine work — sorting live, killing from the interface, seeing load develop — you want htop or btop, and --watch is not a substitute for either.

Configuration

The default columns are reasonable but wide. If your terminal is not, a configuration file at ~/.config/procs/config.toml lets you choose which columns appear and in what order — dropping the ones you never read is the single change worth making.

procs --list                 # every available column
procs --insert TcpPort       # add one for this run
procs --pager disable        # stop it opening a pager on short output

Quick reference

procs                      # everything
procs nginx                # search by name, command or PID
procs --tree               # parent and child structure
procs --sortd cpu          # busiest first
procs --sortd mem
procs --watch nginx        # refresh continuously
sudo procs --or port:8080  # what is listening there
procs --list               # the available columns

Related