shell 单实例(2)
来源:互联网 发布:关于考研的淘宝店铺 编辑:程序博客网 时间:2024/06/14 03:26
为保证单实例运行,采用如下思考方式:
方法一(推荐这种)
通过锁文件和进程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 0fi
方法二
通过查找进程的个数进行判断
(进程个数在终端运行有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_oprsleep 60
阅读全文
0 0
- shell 单实例(2)
- shell 单实例(1)
- Linux Shell单实例运行
- shell脚本单实例互斥
- shell脚本实例2
- 【shell】实例(2)
- shell实例浅谈之十一单实例运行(shell运行一次)
- shell实例浅谈之单实例运行(shell运行一次)
- shell实例
- shell实例
- shell实例
- shell实例
- Shell实例
- Linux下安装mysql单实例shell脚本(源代码方式安装)
- 炼数成金---shell实例编程笔记(2)
- shell 单双引号
- 单实例运行
- 单实例模式(Singleton)
- 银联支付
- URAL 1960- Palindromes and Super Abilities (回文树)
- windows内网文件共享
- SQL 的四大连接方式
- 4.3 数据的格式化键盘输入习题4
- shell 单实例(2)
- 初步学习c语言
- UITableView 优化
- 毕业设计系统基本框架 【basic 1.0】springMVC+mybatis+mysql
- 软考复习:数据结构基础(1.1线性表)
- getElementsByClassName兼容新老浏览器方法
- Java 中,File 类的一些常用操作比如过滤,遍历等操作
- 朴素贝叶斯
- 第一个爬虫程序