如何检查进程是否已经在bash(shell脚本)Linux中运行

时间:2020-01-09 10:37:38  来源:igfitidea点击:

现在如何检查bash Linux中是否已经在运行进程?如何确定同一脚本或者进程的多个实例是否在后台运行?如果在Linux中使用bash在shell脚本中的另一个会话上已经运行了相同脚本的重复实例,该如何退出脚本?

有多种方法可以确定重复实例并检查进程是否已在运行。我将分享一些我在Shell脚本中常用的方法。

检查进程是否已在运行-方法1

最简单直接的方法是使用pidof。在脚本启动时使用以下功能,可以确保一次只运行一个脚本实例。

#!/bin/bash
script_name=$(basename -- "
#!/bin/bash
script_name=$(basename -- "
script_name=$(basename -- "##代码##")
pid=(`pgrep -f $script_name`)
pid_count=${#pid[@]}
[[ -z $pid ]] && echo "Failed to get the PID"
if [ -f "/var/run/$script_name" ];then
   if [[  $pid_count -gt "1" ]];then
      echo "An another instance of this script is already running, please clear all the sessions of this script before starting a new session"
      exit 1
   else
      echo "Looks like the last instance of this script exited unsuccessfully, perform cleanup"
      rm -f "/var/run/$script_name"
   fi
fi
echo $pid > /var/run/$script_name
# Main Function
rm -f "/var/run/$script_name"
") pid=(`pgrep -f $script_name`) [[ -z $pid ]] && echo "Failed to get the PID" && exit 1 if [ -f "/var/run/$script_name" ];then echo "An another instance of this script is already running, please clear all the sessions of this script before starting a new session" exit 1 fi echo $pid > /var/run/$script_name # Main Function rm -f "/var/run/$script_name"
") if pidof -x "$script_name" -o $$>/dev/null;then echo "An another instance of this script is already running, please clear all the sessions of this script before starting a new session" exit 1 fi

检查进程是否已经在运行-方法2

随着每个系统守护进程的启动,在/var/run下创建一个PID文件。因此,我们可以使用类似的方法来跟踪脚本中任何已经运行的实例的PID状态。例如,如果该脚本由于某种原因突然退出,然后再从/var/run中删除PID文件,则此方法不是很可靠。即使在没有脚本实例处于运行状态的情况下,脚本仍然会抛出错误并退出。

但是通过添加一个陷阱并为任何突然退出执行清除操作仍然可以使用。

##代码##

检查进程是否已经在运行-方法3

此方法使用方法2中的功能,但功能更强大。其中:我们将添加更多检查以确保即使脚本突然退出,该函数也将执行所需的清除。

##代码##