为保证单实例运行,采用如下思考方式:
方法一(推荐这种)
通过锁文件和进程ID的有效性进行判断
第一步,程序开始运行前,先进性锁文件和文件保存进程ID的有效性判断
第二步,程序开始运行,将建立锁文件,并将进程ID写入文件
shell 代码如下:
# 先建立单实例脚本,保存单实例函数,用于后面脚本的包含和调用
# single.sh
#!/bin/sh
#
# 此脚本用于单实例保护
#
#############################################配置项########################################
#
# 单实例保护
# 参数1: 进程名称
# 参数2: 进程路径
#
single_opr()
{
# 本进程名字
local process_name=$1
# 进程号路径
local pid_file_lock=$2
# 查找程序进程
local new_process_id=`ps -af | grep -v grep | grep "${process_name}" | awk '{if(1==NR){ print $1}}'`
if [ "X${new_process_id}" = "X" ] ; then
# 查询内容为空
echo -n "fail: failed to check process!"
exit 1
fi
# 判断文件是否存在,
if [ -f "$pid_file_lock" ] ; then
# 文件存在,查询进程号
local old_process_id=`cat $pid_file_lock | awk '{if(1==NR){ print $1}}'`
if [ "X${old_process_id}" = "X" ] ; then
# 查询内容为空, 程序没有运行,将进程ID写入文件
echo "$new_process_id" > $pid_file_lock
return 0
else
# 查询内容不为空, 检查程序是否存在这个进程ID
local exists=`ps -af | grep -v grep | grep "${process_name}" | awk -v var="$old_process_id" '{if($1"" == var"" ){ print $1}}'`
if [ "X${exists}" = "X" ] ; then
# 不存在,则程序没有运行,将进程ID写入文件
echo "$new_process_id" > $pid_file_lock
return 0
else
# 存在,则程序正在运行,退出程序
return 1
fi
fi
else
# 文件不存在, 程序没有运行,将进程ID写入文件
echo "$new_process_id" > $pid_file_lock
return 0
fi
}
# 调用脚本,用此脚本包含单实例脚本内容并调用
# test.sh
#!/bin/sh
#
# 此脚本用于验证单实例
#
#############################################配置项########################################
# 临时文件锁路径
tmp_file_lock="/var/lock/wlan_opr"
# 本进程名字
process_name=`basename $0`
# 单实例文件路径
single_path="./single.sh"
# 包含单实例
source $single_path
# 运行单实例检测
single_opr "$process_name" "$tmp_file_lock"
if [ $? -eq 1 ] ; then
echo "running"
exit 0
fi
方法二
通过查找进程的个数进行判断
(进程个数在终端运行有2个,而我在arm开发板c程序使用popen调用时运行时有3个,所以需要看情况使用)
#!/bin/sh
# 本进程名字
process_name=`basename $0`
# 单实例保护
single_opr()
{
# 只能有一个进程
local num=`ps -af | grep -v grep | grep "${process_name}" | awk 'END{print NR}'`
if [ "X${num}" = "X" ] ; then
# 查询内容为空
echo -n "fail: failed to check process!"
exit 1
elif [ ${num} -gt 2 ] ; then
# 运行中,进程为2个,而我在开发板c程序popen调用时出现3个进程,需要视情况而定
echo -n "running"
exit 0
else
# 没有连接
return 0
fi
}
# 运行单实例检测
single_opr
sleep 60