Linux Commands GuideLinux Tutorials

Mastering the pgrep Command in Linux: Find, Filter, and Act on Running Processes

The pgrep command in Linux is an essential tool for administrators and power users who need to quickly locate running processes by name, user, parent PID, terminal, or full command line. This practical guide covers the pgrep command in Linux with clear examples and best practices for filtering results, formatting output, and using the command safely in scripts and automation. You will learn how to produce precise matches, show process names or full command lines, count or delimit results, and combine pgrep with pkill, kill, and xargs to manage processes reliably. The examples use real-world outputs to help you adopt pgrep confidently across Debian, Ubuntu, RHEL, CentOS, and Arch systems.

pgrep syntax and basic usage

At its simplest, pgrep searches the active process table and returns PIDs that match a provided pattern (regular expression). The tool is fast, intended for scripting, and is part of the procps(-ng) package on most Linux distributions. The default match is against the process name (the comm field). Below is a basic invocation to find all processes that contain “ssh” in their name.

pgrep ssh

1039
2257
6850
31279

The output lists one PID per line. In scripts, check the exit code: 0 means at least one match, 1 means no matches. Use this form to quickly pipe PIDs into kill or other utilities after verification.

Show process names or full command lines

By default pgrep prints only PIDs. To get human-readable output that shows the process name next to each PID, use the -l flag. To inspect the exact invocation or arguments, include -a for the full command line. These variants are invaluable when multiple processes share the same name.

pgrep -l ssh

1039 sshd
2257 ssh-agent
6850 ssh
31279 ssh-agent

The -l option prints PID followed by the process name. This helps distinguish daemons (sshd) from user clients (ssh).

pgrep -a ssh

1039 /usr/sbin/sshd -D
6850 ssh user@example.com

The -a option prints the PID and the full command line, making it easy to differentiate instances launched with distinct arguments.

Format output: delimiters and counts

When you need output formatted for scripting, pgrep supports custom delimiters and count-only mode. Use -d to change the delimiter (default is newline) and -c to return only the number of matching processes.

pgrep -d ' ' ssh

1039 2257 6850 31279

This example uses a space delimiter so downstream tools (xargs or shell loops) can process the IDs on a single line.

pgrep -c -u mark

4

The -c flag returns the count of matching processes. Here it's combined with -u to count processes owned by user mark.

Precise matching: exact names and full command-line searches

pgrep uses regular expressions by default, which can lead to partial matches. To ensure exact matches against the process name, use -x. To match the full command-line (including arguments and interpreter paths), use -f. Combining -f with -a can reveal the full invocation that matched.

pgrep -x ssh

6850

With -x, pgrep matches the process name exactly. This prevents matching sshd or ssh-agent when you only want ssh.

pgrep -fa "python3 app.py"

4510 python3 /home/deploy/app.py --config /etc/app/config.yml

Using -f searches the entire command line; -a displays the matching command. This is important when multiple Python processes exist and you need the specific script instance.

Filter by user, terminal, and parent process

Commonly you need to find processes that belong to a particular user, are attached to a specific tty/pts, or that are children of a known parent process. pgrep provides options for all of these: -u for user, -t for terminal, and -P for parent PID.

pgrep -u root

1
1029
2048

List PIDs owned by root. Use commas to supply multiple users, for example: pgrep -u root,syslog.

pgrep -t pts/2

5784
5789

The -t option finds processes attached to the named terminal (usable when diagnosing interactive sessions).

pgrep -P 1234

1235
1236

Use -P to list child processes of the parent PID 1234. This is useful for tracking worker processes spawned by a supervisor.

Newest, oldest, and inverted matches

If you only need the most recent or the earliest matching process, use -n (newest) or -o (oldest). To exclude matches (show everything that does NOT match), use -v. These flags are handy for cleanup scripts and monitoring checks.

pgrep -n ssh

31279

-n returns the PID of the most recently started matching process.

pgrep -o ssh

1039

-o returns the PID of the oldest matching process.

pgrep -v -u mark ".*"

1
2
3
4
6

Combining -v with -u effectively lists PIDs not owned by mark. The pattern ".*" matches all process names; the inversion selects the complement.

Using pgrep safely in scripts and automation

When scripting, avoid blindly killing PIDs. First preview matches with -a and verify the selection. Check pgrep's exit code and only act when you intend to. Below is a simple check used in system scripts to test if nginx is running (note: pgrep prints the PID when found, otherwise nothing).

pgrep -x nginx

1234

In scripts, use if pgrep -x nginx > /dev/null; then ... to branch on presence. The example above shows PID 1234, indicating nginx is running; if no PID were found, pgrep would return exit code 1 and produce no stdout.

Combining pgrep with pkill, kill, and xargs

pgrep is ideal for filtering PIDs and piping them to other utilities. A safe workflow: use pgrep -a to review matches, then pass PIDs to pkill or kill. When passing to xargs, use a delimiter-friendly format (like space with -d). Example below shows pgrep combined with xargs to send SIGTERM after confirmation.

pgrep -d ' ' ssh

1039 2257 6850 31279

This single-line PID list can be piped to xargs -r kill once you've reviewed the targets. Always verify with -a first to avoid accidental termination of wrong processes.

When pgrep returns unexpected results — troubleshooting tips

If you see no output despite a process running, confirm the process name or switch to -f to match on the full command line. If you get too many matches, anchor your pattern or use -x. Visibility of processes varies by user; privileged processes may be hidden from unprivileged users on some systems — use sudo when necessary. Remember that pgrep uses regex: special characters in the pattern must be escaped.

Conclusion

pgrep is a compact, powerful utility for locating running processes by name, user, terminal, parent PID, or full command line. It is optimized for scripts and automation: return codes indicate presence or absence, while options like -l, -a, -d, and -c help format output for human review or downstream tools. Use exact matching and command-line matching carefully, preview results before sending signals, and combine pgrep with pkill, kill, or xargs only after verification. Mastering these patterns will make process management safer and more efficient across Debian, Ubuntu, RHEL, CentOS, and Arch systems.

Komentariši

Vaša email adresa neće biti objavljivana. Neophodna polja su označena sa *