How to list running processes → ps
How to List Running Processes → ps
Table of Contents
1. [Introduction](#introduction)
2. [Prerequisites](#prerequisites)
3. [Understanding the ps Command](#understanding-the-ps-command)
4. [Basic ps Command Syntax](#basic-ps-command-syntax)
5. [Common ps Command Options](#common-ps-command-options)
6. [Practical Examples and Use Cases](#practical-examples-and-use-cases)
7. [Advanced ps Command Usage](#advanced-ps-command-usage)
8. [Output Format Customization](#output-format-customization)
9. [Filtering and Sorting Process Lists](#filtering-and-sorting-process-lists)
10. [Troubleshooting Common Issues](#troubleshooting-common-issues)
11. [Best Practices and Professional Tips](#best-practices-and-professional-tips)
12. [Alternative Process Monitoring Tools](#alternative-process-monitoring-tools)
13. [Conclusion](#conclusion)
Introduction
The `ps` command is one of the most fundamental and essential tools in Linux and Unix-like operating systems for viewing and monitoring running processes. Whether you're a system administrator troubleshooting performance issues, a developer debugging applications, or a power user managing system resources, understanding how to effectively use the `ps` command is crucial for system management and process monitoring.
This comprehensive guide will walk you through everything you need to know about the `ps` command, from basic usage to advanced techniques. You'll learn how to list processes, interpret output, customize displays, filter results, and troubleshoot common issues. By the end of this article, you'll have mastered the art of process monitoring using the `ps` command and be equipped with professional-level skills for system administration.
Prerequisites
Before diving into the `ps` command, ensure you have:
- Operating System: Linux, Unix, macOS, or any Unix-like system
- Terminal Access: Command-line interface access
- Basic Command Line Knowledge: Familiarity with terminal navigation and basic commands
- User Permissions: Standard user access (some advanced features may require root privileges)
- Text Editor (optional): For creating scripts and configuration files
System Requirements:
- Any modern Linux distribution (Ubuntu, CentOS, Debian, Red Hat, etc.)
- macOS with Terminal application
- Unix-like systems with POSIX compliance
- Windows Subsystem for Linux (WSL) for Windows users
Understanding the ps Command
The `ps` command stands for "process status" and provides a snapshot of currently running processes on your system. Unlike dynamic monitoring tools like `top` or `htop`, `ps` displays a static view of processes at the moment the command is executed.
What is a Process?
A process is an instance of a running program. Every time you execute a command, launch an application, or run a script, the system creates a process. Each process has unique characteristics:
- Process ID (PID): Unique numerical identifier
- Parent Process ID (PPID): ID of the process that created this process
- User ID (UID): User who owns the process
- CPU Usage: Processor time consumed
- Memory Usage: RAM consumption
- Status: Current state (running, sleeping, stopped, zombie)
How ps Works
The `ps` command reads process information from the `/proc` filesystem in Linux systems. This virtual filesystem contains real-time information about system processes, making it the primary source for process monitoring tools.
Basic ps Command Syntax
The basic syntax of the `ps` command follows this pattern:
```bash
ps [options]
```
Simple ps Command Examples
Basic process listing:
```bash
ps
```
This displays processes associated with your current terminal session.
Example output:
```
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps
```
Show all processes for current user:
```bash
ps -u
```
Show all system processes:
```bash
ps -e
```
Common ps Command Options
The `ps` command offers numerous options for customizing output. Here are the most commonly used options:
BSD-Style Options (without dashes)
```bash
Show all processes
ps aux
Show processes in tree format
ps axjf
Show processes with full command lines
ps auxww
```
UNIX-Style Options (with dashes)
```bash
Show all processes
ps -ef
Show processes for specific user
ps -u username
Show processes with specific PID
ps -p 1234
```
GNU-Style Options (with double dashes)
```bash
Show all processes with detailed info
ps --forest
Show processes by command name
ps --comm firefox
```
Essential Option Combinations
| Command | Description | Use Case |
|---------|-------------|----------|
| `ps aux` | All processes, user-oriented format | General system overview |
| `ps -ef` | All processes, full format | Detailed process information |
| `ps -eo pid,ppid,cmd,%mem,%cpu` | Custom column display | Performance monitoring |
| `ps -u username` | Processes by specific user | User activity monitoring |
| `ps -C processname` | Processes by command name | Application monitoring |
Practical Examples and Use Cases
Example 1: Basic System Overview
```bash
Display all running processes with detailed information
ps aux
Sample output:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 19696 2984 ? Ss 09:15 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 09:15 0:00 [kthreadd]
john 1234 0.5 2.1 125648 43256 ? Sl 09:20 0:15 firefox
```
Example 2: Finding Specific Processes
```bash
Find all Firefox processes
ps aux | grep firefox
Find processes by specific user
ps -u apache
Find processes by PID
ps -p 1234,5678,9012
```
Example 3: Memory Usage Analysis
```bash
Show processes sorted by memory usage
ps aux --sort=-%mem | head -10
Show only memory-intensive processes
ps -eo pid,ppid,cmd,%mem --sort=-%mem | head -20
```
Example 4: CPU Usage Monitoring
```bash
Show processes sorted by CPU usage
ps aux --sort=-%cpu | head -10
Custom format for CPU monitoring
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
```
Example 5: Process Tree Visualization
```bash
Show process hierarchy
ps axjf
Alternative tree view
ps -ef --forest
Show tree for specific user
ps -u username --forest
```
Advanced ps Command Usage
Process State Codes
Understanding process states is crucial for system monitoring:
| Code | State | Description |
|------|-------|-------------|
| R | Running | Currently executing or ready to run |
| S | Sleeping | Waiting for an event to complete |
| D | Uninterruptible | Usually waiting for I/O |
| T | Stopped | Stopped by job control signal |
| Z | Zombie | Terminated but not reaped by parent |
| X | Dead | Should never be seen |
Advanced Filtering Techniques
```bash
Show only running processes
ps aux | awk '$8 ~ /^R/ {print}'
Show processes using more than 1% CPU
ps aux | awk '$3 > 1.0 {print}'
Show processes using more than 100MB memory
ps aux | awk '$6 > 100000 {print}'
Show zombie processes
ps aux | awk '$8 ~ /Z/ {print}'
```
Real-Time Process Monitoring
```bash
Continuously monitor processes (updates every 2 seconds)
watch -n 2 'ps aux --sort=-%cpu | head -20'
Monitor specific process by name
watch -n 1 'ps aux | grep apache'
Monitor memory usage changes
watch -n 5 'ps aux --sort=-%mem | head -10'
```
Output Format Customization
Custom Column Selection
The `-o` option allows you to specify exactly which columns to display:
```bash
Basic custom format
ps -eo pid,ppid,cmd
Detailed custom format with headers
ps -eo pid,ppid,user,cmd,%cpu,%mem,stat,start,time
Custom format for security analysis
ps -eo pid,ppid,uid,gid,cmd,args
```
Useful Custom Formats
```bash
Performance monitoring format
ps -eo pid,ppid,cmd,%cpu,%mem,vsz,rss --sort=-%cpu
Security audit format
ps -eo pid,ppid,euid,ruid,sgid,fsgid,cmd
Process relationship format
ps -eo pid,ppid,pgrp,sid,cmd --forest
```
Column Descriptions
| Column | Description | Example |
|--------|-------------|---------|
| PID | Process ID | 1234 |
| PPID | Parent Process ID | 1000 |
| CMD | Command name | firefox |
| ARGS | Full command line | firefox --new-tab |
| %CPU | CPU utilization | 15.2 |
| %MEM | Memory utilization | 8.5 |
| VSZ | Virtual memory size (KB) | 125648 |
| RSS | Resident set size (KB) | 43256 |
| STAT | Process state | Sl |
| START | Start time | 09:20 |
| TIME | CPU time | 0:15 |
Filtering and Sorting Process Lists
Sorting Options
```bash
Sort by CPU usage (descending)
ps aux --sort=-%cpu
Sort by memory usage (descending)
ps aux --sort=-%mem
Sort by process start time
ps aux --sort=start
Multiple sort criteria
ps aux --sort=-%cpu,-%mem
Sort by PID (ascending)
ps aux --sort=pid
```
Advanced Filtering with grep
```bash
Find processes containing specific text
ps aux | grep -i apache
Exclude grep itself from results
ps aux | grep -v grep | grep apache
Find processes by multiple criteria
ps aux | grep -E "(apache|nginx|mysql)"
Case-insensitive search
ps aux | grep -i firefox
```
Using awk for Complex Filtering
```bash
Show processes using more than 5% CPU
ps aux | awk 'NR>1 && $3>5 {print $0}'
Show processes by specific user with high memory usage
ps aux | awk '$1=="apache" && $4>2.0 {print $0}'
Count processes by user
ps aux | awk 'NR>1 {count[$1]++} END {for(user in count) print user, count[user]}'
```
Troubleshooting Common Issues
Issue 1: Command Not Found
Problem: `ps: command not found`
Solution:
```bash
Check if ps is installed
which ps
Install procps package (Ubuntu/Debian)
sudo apt-get install procps
Install procps package (CentOS/RHEL)
sudo yum install procps-ng
```
Issue 2: Permission Denied
Problem: Cannot see all processes or detailed information
Solution:
```bash
Use sudo for full system access
sudo ps aux
Check current user permissions
id
Run with elevated privileges when needed
sudo ps -ef
```
Issue 3: Output Too Wide
Problem: Process command lines are truncated
Solution:
```bash
Use wide output format
ps auxww
Specify width
ps aux --width 200
Use custom format for specific columns
ps -eo pid,cmd:50,user
```
Issue 4: Too Many Processes
Problem: Output is overwhelming with too many processes
Solution:
```bash
Limit output with head
ps aux | head -20
Filter by user
ps -u $USER
Use paging
ps aux | less
Focus on active processes
ps aux --sort=-%cpu | head -10
```
Issue 5: Process Information Outdated
Problem: Process list doesn't reflect current state
Solution:
```bash
ps shows snapshot, use top for real-time
top
Use watch for periodic updates
watch -n 1 'ps aux --sort=-%cpu | head -10'
Combine with other tools
ps aux && echo "--- Updated: $(date) ---"
```
Best Practices and Professional Tips
System Administration Best Practices
1. Regular Process Monitoring
```bash
# Create monitoring script
#!/bin/bash
echo "Top CPU consumers:"
ps aux --sort=-%cpu | head -5
echo "Top memory consumers:"
ps aux --sort=-%mem | head -5
echo "Process count by user:"
ps aux | awk 'NR>1 {count[$1]++} END {for(user in count) print user, count[user]}'
```
2. Security Monitoring
```bash
# Check for suspicious processes
ps aux | grep -E "(nc|netcat|nmap|tcpdump)"
# Monitor processes running as root
ps aux | awk '$1=="root" {print}'
# Check for processes without controlling terminal
ps aux | awk '$7=="?" {print}'
```
3. Performance Optimization
```bash
# Identify resource-heavy processes
ps aux --sort=-%cpu,-%mem | head -10
# Find long-running processes
ps -eo pid,etime,cmd --sort=etime | tail -10
# Monitor process states
ps aux | awk '{print $8}' | sort | uniq -c
```
Professional Tips
1. Create Useful Aliases
```bash
# Add to ~/.bashrc
alias pscpu='ps aux --sort=-%cpu | head -10'
alias psmem='ps aux --sort=-%mem | head -10'
alias psme='ps -u $USER'
alias pstree='ps axjf'
```
2. Combine with Other Tools
```bash
# Process monitoring with timestamps
ps aux | while read line; do echo "$(date): $line"; done
# Export process list to file
ps aux > processes_$(date +%Y%m%d_%H%M%S).txt
# Process analysis with statistics
ps aux | awk 'NR>1 {cpu+=$3; mem+=$4; count++} END {print "Avg CPU:", cpu/count, "Avg MEM:", mem/count}'
```
3. Scripting Integration
```bash
#!/bin/bash
# Process monitoring script
THRESHOLD_CPU=80
THRESHOLD_MEM=80
ps aux | awk -v cpu_thresh=$THRESHOLD_CPU -v mem_thresh=$THRESHOLD_MEM '
NR>1 && ($3>cpu_thresh || $4>mem_thresh) {
print "ALERT: High resource usage - PID:" $2 " CMD:" $11 " CPU:" $3 " MEM:" $4
}'
```
Performance Considerations
- Use `ps` for snapshots, not continuous monitoring
- Combine with `watch` for periodic updates
- Filter output early to reduce processing overhead
- Use specific options rather than parsing full output
- Consider `pgrep` and `pkill` for process management tasks
Alternative Process Monitoring Tools
While `ps` is fundamental, other tools complement process monitoring:
Dynamic Monitoring Tools
```bash
Real-time process viewer
top
Enhanced interactive process viewer
htop
I/O monitoring
iotop
Network process monitoring
nethogs
```
Specialized Process Tools
```bash
Find processes by name
pgrep firefox
Kill processes by name
pkill firefox
Process tree viewer
pstree
Detailed process information
cat /proc/PID/status
```
Comparison Table
| Tool | Use Case | Real-time | Interactive |
|------|----------|-----------|-------------|
| ps | Snapshots, scripting | No | No |
| top | Real-time monitoring | Yes | Yes |
| htop | Enhanced monitoring | Yes | Yes |
| pgrep | Process searching | No | No |
| pstree | Process relationships | No | No |
Conclusion
The `ps` command is an indispensable tool for system administration, debugging, and process management in Linux and Unix-like systems. Throughout this comprehensive guide, we've explored everything from basic usage to advanced techniques, covering practical examples, troubleshooting scenarios, and professional best practices.
Key Takeaways
1. Master the Basics: Understanding fundamental `ps` options like `aux` and `-ef` provides a solid foundation for process monitoring.
2. Customize Output: Use custom formatting options to display exactly the information you need for specific tasks.
3. Combine Tools: Integrate `ps` with other command-line tools like `grep`, `awk`, and `sort` for powerful process analysis.
4. Monitor Efficiently: Use appropriate filtering and sorting techniques to focus on relevant processes without information overload.
5. Script Integration: Incorporate `ps` commands into monitoring scripts for automated system administration tasks.
Next Steps
To further enhance your process monitoring skills:
1. Practice Regular Monitoring: Make process checking part of your routine system administration tasks
2. Learn Complementary Tools: Explore `top`, `htop`, `pgrep`, and `pkill` for comprehensive process management
3. Develop Monitoring Scripts: Create automated monitoring solutions using `ps` combined with shell scripting
4. Study System Performance: Use process information to understand and optimize system performance
5. Explore Advanced Features: Dive deeper into process scheduling, priorities, and resource management
The `ps` command, while simple in concept, offers tremendous depth and flexibility for system monitoring and management. By mastering its various options and techniques, you'll be well-equipped to handle any process-related task in your Linux or Unix environment. Whether you're troubleshooting performance issues, monitoring security, or simply keeping track of system activity, the skills you've learned in this guide will serve as a foundation for effective system administration.
Remember that effective process monitoring is not just about knowing the commands—it's about understanding what the information tells you about your system's health, performance, and security. Use this knowledge wisely, and continue exploring the rich ecosystem of Linux process management tools to become a more proficient system administrator.