shell 单实例(2)


为保证单实例运行,采用如下思考方式:

方法一(推荐这种) 

通过锁文件和进程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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值