Multiple Methods and Best Practices for Detecting Shell Script Running Status in Linux

Nov 28, 2025 · Programming · 10 views · 7.8

Keywords: Linux Process Detection | Shell Script Monitoring | pgrep Command

Abstract: This article provides a comprehensive exploration of various methods to detect whether shell scripts are running in Linux systems, with detailed analysis of ps command, pgrep command, and process status checking techniques. By comparing the advantages and disadvantages of different approaches, it offers complete code examples and practical application scenarios to help readers choose the most suitable solution. The article also delves into issues of process matching accuracy, zombie process handling, and conditional judgment implementation in scripts.

Introduction

In Linux system administration and automated script development, there is often a need to detect the running status of specific processes or scripts. This requirement is particularly important in scenarios such as system monitoring, process daemon implementation, and avoiding duplicate execution. This article systematically introduces multiple detection methods and demonstrates their practical applications through detailed code examples.

Basic Detection Methods

Using ps Command with grep

The most fundamental detection method involves using the ps command combined with grep for process searching:

ps aux | grep "aa.sh"

This method searches the process list for processes containing specific strings. However, this approach has significant limitations: the search results include the grep command itself, which may lead to false positives. Additionally, when script names are short or similar to other process names, false positive results are likely to occur.

Improved ps Detection Method

To address the limitations of the basic method, a more precise detection approach can be employed:

result=$(ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l)
if [ $result -ge 1 ]
then
    echo "Script is running"
else
    echo "Script is not running"
fi

This method combines multiple commands through piping: first using ps aux to obtain all processes, then using grep -i for case-insensitive matching, followed by grep -v to exclude lines containing "grep", and finally using wc -l to count lines. When the count result is greater than or equal to 1, the script is considered to be running.

Advanced Detection Techniques

Using pgrep Command

pgrep is a tool specifically designed for process searching, providing a more concise and efficient solution:

pgrep -fl aa.sh

In scripts, it can be used in combination with conditional statements:

if pgrep -fl aa.sh &>/dev/null; then
    echo "Script is running"
    # Perform related operations
fi

The -f option in the pgrep command indicates matching the complete command line, while the -l option displays the process name and PID. Redirecting output to /dev/null suppresses unnecessary output.

Importance of Exact Matching

In practical applications, exact matching is crucial. Using the -x option ensures matching only identical process names:

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

This method avoids false positives caused by partial matching, particularly in environments where process names are short or similar process names exist.

In-depth Analysis of Process Status Detection

Handling Zombie Processes

Standard process detection methods may not distinguish between running processes and zombie processes. The following function provides more reliable detection:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

if _isRunning lxpanel; then
    echo "lxpanel is running"
else
    lxpanel &
fi

This function uses ps -o comm= -C to obtain the process name of the specified command, then performs exact matching through grep -x, effectively excluding interference from zombie processes.

Using pidof Command

pidof is another practical process searching tool:

pidof -x $(basename $0)

In conditional statements, it can be used with logical operators:

(pidof chrome 1>/dev/null && echo "Process is running") || echo "Process is not running"

Practical Application Scenarios

Single Instance Script Execution

Ensuring that only one instance of a script is running is a common requirement:

#!/bin/bash

# Check if an instance is already running
if pgrep -f "$(basename $0)" | grep -v "$$" >/dev/null; then
    echo "Script is already running, exiting"
    exit 1
fi

# Main logic
echo "Script execution started"
# ... other code

Process Daemon Implementation

Creating a simple process daemon to ensure continuous operation of specific processes:

#!/bin/bash

while true; do
    pid=$(pgrep -x "${1}")
    if [ -z "$pid" ]; then
        echo "Process not running, restarting"
        ${1} &
    else
        sleep 60
    fi
done

Best Practices Summary

When selecting detection methods, consider the following factors:

By appropriately selecting and applying these methods, reliable and efficient process monitoring and management systems can be constructed.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.