ps

All posts tagged ps by Linux Bash
  • Posted on

    Process management is a key concept when working with Bash and Linux/Unix-like systems. It involves handling the execution of programs or commands, tracking their status, and controlling their execution flow. In Bash, you can manage processes in several ways: running background processes, managing jobs, and using tools like ps to monitor processes. Below is an explanation of background processes, jobs, and how to use ps for process management.

    1. Background Processes

    A background process in Bash runs independently of the terminal session, allowing you to continue using the terminal while the process executes. This is useful for long-running tasks or when you need to run multiple tasks simultaneously.

    Running a Command in the Background

    To run a command in the background, append an & at the end of the command.

    sleep 60 &  # Run the sleep command in the background
    
    • The process starts running in the background, and Bash returns the prompt to you immediately.
    • The process will continue running even if you close the terminal, unless it's explicitly tied to the terminal session.

    Example:

    $ sleep 60 &
    [1] 12345
    

    Here, [1] is the job number, and 12345 is the process ID (PID) of the background process.

    2. Job Control in Bash

    Bash supports job control, which allows you to manage multiple processes that you have started in the background or in the foreground. You can suspend jobs, bring them to the foreground, or kill them.

    Listing Jobs

    To list the current jobs running in the background, use the jobs command:

    jobs
    

    Output example:

    [1]+ 12345 Running                 sleep 60 &
    [2]- 12346 Running                 sleep 100 &
    

    Each job has a job number (e.g., [1], [2]) and a process ID (PID). The + and - symbols represent the most recent job and the previous job, respectively.

    Bringing a Background Job to the Foreground

    To bring a background job to the foreground, use the fg command followed by the job number:

    fg %1
    

    This will bring job 1 (the one with job number [1]) to the foreground.

    Sending a Job to the Background

    If you've stopped a foreground job (e.g., by pressing Ctrl+Z), you can send it back to the background with the bg command:

    bg %1
    

    This resumes job 1 in the background.

    Stopping a Job

    If you want to stop a running job, you can suspend it by pressing Ctrl+Z. This sends a SIGTSTP signal to the process, which halts its execution temporarily.

    You can also use the kill command to send a termination signal (SIGTERM):

    kill %1  # Kill job 1
    

    To forcefully terminate a process, use the -9 option:

    kill -9 %1  # Force kill job 1
    

    Example: Job Control in Action

    $ sleep 100 &
    [1] 12345
    $ jobs
    [1]+ 12345 Running                 sleep 100 &
    $ fg %1
    sleep 100
    # Press Ctrl+Z to stop the job
    $ jobs
    [1]+ 12345 Stopped                 sleep 100
    $ bg %1
    [1]+ 12345 Running                 sleep 100 &
    

    3. Using ps to Monitor Processes

    The ps (process status) command is used to display information about running processes. It’s a versatile tool for monitoring system activity.

    Basic ps Command

    By default, ps shows processes running in the current terminal session:

    ps
    

    Output example:

    PID TTY          TIME CMD
    12345 pts/1    00:00:00 bash
    12346 pts/1    00:00:00 ps
    
    • PID: Process ID
    • TTY: Terminal associated with the process
    • TIME: CPU time the process has consumed
    • CMD: The command running

    Viewing All Processes

    To see all processes running on the system, use the -e or -A option:

    ps -e
    

    Or:

    ps -A
    

    This lists every process on the system, not just those tied to the current session.

    Viewing Detailed Information

    For more detailed information, use the -f (full-format listing) option:

    ps -ef
    

    This displays additional columns such as the parent process ID (PPID), user, and more.

    Output example:

    UID        PID  PPID  C STIME TTY      TIME     CMD
    1000      12345  1234  0 10:00 pts/1  00:00:00 bash
    1000      12346  12345  0 10:00 pts/1  00:00:00 ps
    
    • UID: User ID
    • PID: Process ID
    • PPID: Parent process ID
    • C: CPU utilization
    • STIME: Start time
    • TTY: Terminal type
    • TIME: Total CPU time used
    • CMD: Command name

    Viewing Process Tree

    You can view processes in a hierarchical tree-like format using the --forest option with ps:

    ps -ef --forest
    

    This shows the parent-child relationships between processes, which is useful for understanding how processes are spawned.

    Filtering with ps

    You can filter processes based on certain criteria using options like -p (for a specific PID) or -u (for a specific user).

    Example: View process for a specific PID:

    ps -p 12345
    

    Example: View processes for a specific user:

    ps -u username
    

    4. Other Useful Process Management Commands

    • top: Displays an interactive, real-time view of system processes, including resource usage (CPU, memory).

      top
      
    • htop: A more user-friendly, interactive version of top with additional features.

      htop
      
    • kill: Used to send signals to processes (e.g., terminate them).

      kill PID
      kill -9 PID  # Force kill
      
    • nice: Used to set process priority (CPU scheduling). A process with a lower priority will get less CPU time.

      nice -n 10 command
      
    • renice: Adjust the priority of a running process.

      renice -n 10 -p PID
      

    Summary of Key Commands:

    • Background process: Run with &.
    • Jobs: Use jobs, fg, bg to manage jobs.
    • Process status: Use ps, top, and htop to monitor processes.
    • Kill process: Use kill or kill -9 to terminate processes.
    • Managing priorities: Use nice and renice to manage process priorities.

    Mastering these process management tools will help you efficiently manage multiple tasks and optimize your system's performance in Bash.