通过脚本案例学习shell(一)如何通过复杂锁脚本解决脚本正在运行或者被意外中断问题 推荐
2013-03-11 21:36
856 查看
通过脚本案例学习shell(一)
---如何通过复杂锁脚本得知脚本正在运行或者被意外中断
锁是一种机制,是程序与程序之间协同工作的一种机制。
运行脚本程序会遇到以下问题:
1、早上你打开电脑运行了一个时间比较长的脚本,突然被老板叫了过去,等你回来你缺忘了是否运行过此脚本怎么办?
2、有一天你正在运行某一个脚本,服务器突然宕机,但是你又想知道脚本是否运行完成.
如何解决以上问题呢!
有一种方法是通过在脚本运行之前创建一个锁文件,通过判断锁文件是否存在而判断脚本是否在执行.
下面通过一个复杂锁实现脚本的自动化运维过程.
如果思路如下:
运行脚本前,判断锁文件是否存在,如果存在,说明此脚本可能正在运行也有可能是脚本被意外中断,然后通过判断运行的脚本PID和之前运行的PID是否一致,如果一致,说明脚本正在运行,如果不一致说明脚本是被意外中断,会重新运行此脚本。
部分脚本分析
bash /etc/backup.sh ($0=/etc/backup.sh)
basename $0 显示路径后面的文件名backup.sh
$? 判断上一个语句执行是否有显示正确结果,如果正确显示为0,如果不正确显示非0数字。
$$ 显示父进程ID
通过read命令设置断点进行简单测试锁文件脚本是否OK
测试1、脚本正常运行结束效果。
read是个断点命令,脚本会一致停留着那里,直到按回车进入吓一跳命令
测试2、脚本正在运行测试效果
打开一个终端运行锁脚本
打开另一个终端再次运行锁脚本,由于脚本正在运行,所以在此打开的脚本不会被运行。
测试2、脚本意外中断测试效果
通过Ctrl+c 模拟脚本中断,由于两次的PID不一致,所以脚本会被重新运行。
---如何通过复杂锁脚本得知脚本正在运行或者被意外中断
锁是一种机制,是程序与程序之间协同工作的一种机制。
运行脚本程序会遇到以下问题:
1、早上你打开电脑运行了一个时间比较长的脚本,突然被老板叫了过去,等你回来你缺忘了是否运行过此脚本怎么办?
2、有一天你正在运行某一个脚本,服务器突然宕机,但是你又想知道脚本是否运行完成.
如何解决以上问题呢!
有一种方法是通过在脚本运行之前创建一个锁文件,通过判断锁文件是否存在而判断脚本是否在执行.
下面通过一个复杂锁实现脚本的自动化运维过程.
如果思路如下:
运行脚本前,判断锁文件是否存在,如果存在,说明此脚本可能正在运行也有可能是脚本被意外中断,然后通过判断运行的脚本PID和之前运行的PID是否一致,如果一致,说明脚本正在运行,如果不一致说明脚本是被意外中断,会重新运行此脚本。
#!/bin/bash LOCKFILE=/tmp/$(basename $0)_lockfile //设置变量 if [ -f $LOCKFILE ];then //假如锁文件存在 MYPID=$(cat $LOCKFILE) //查看锁文件中的PID值 ps -p $MYPID | grep $MYPID &>/dev/null //比较PID是否一致 [ $? -eq 0 ] && echo "The script backup.sh is running" && exit 1 //PID一致,则显示运行信息,并退出脚本 else echo $$ > $LOCKFILE //如果锁文件不存在或者锁文件存在,PID不一样,则将新的PID值写入锁文件 fi bash /etc/backup.sh //写你要运行的脚本 rm -rf $LOCKFILE //成功之后删除锁文件
部分脚本分析
bash /etc/backup.sh ($0=/etc/backup.sh)
basename $0 显示路径后面的文件名backup.sh
$? 判断上一个语句执行是否有显示正确结果,如果正确显示为0,如果不正确显示非0数字。
$$ 显示父进程ID
通过read命令设置断点进行简单测试锁文件脚本是否OK
#!/bin/bash LOCKFILE=/tmp/$(basename $0)_lockfile if [ -f $LOCKFILE ];then MYPID=$(cat $LOCKFILE) ps -p $MYPID | grep $MYPID &>/dev/null [ $? -eq 0 ] && echo "The script backup.sh is running" && exit 1 else echo $$ > $LOCKFILE fi echo "The script is running!" read echo "The script is stop!" rm -rf $LOCKFILE
测试1、脚本正常运行结束效果。
read是个断点命令,脚本会一致停留着那里,直到按回车进入吓一跳命令
测试2、脚本正在运行测试效果
打开一个终端运行锁脚本
打开另一个终端再次运行锁脚本,由于脚本正在运行,所以在此打开的脚本不会被运行。
测试2、脚本意外中断测试效果
通过Ctrl+c 模拟脚本中断,由于两次的PID不一致,所以脚本会被重新运行。
相关文章推荐
- Ubuntu学习总结-08 Ubuntu运行Shell脚本报 shell /bin/bash^M: bad interpreter错误问题解决
- 通过脚本案例学习shell(三) --- 通过交互式脚本自动创建Apache虚拟主机 推荐
- 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本 推荐
- 通过脚本案例学习shell(四) --- 通过脚本初始化并加固新安装的Linux系统 推荐
- 通过脚本案例学习shell(二) --- 通过线性显示/etc/passwd内容了解while read用法 推荐
- 【COCOS2DX-LUA 脚本开发之十四】解决自定义cpp类通过tolua++ binding LuaCocos2d后编译到Android运行黑屏(没有调用自定义cpp类)的问题!
- 如何在Shell中通过脚本判断某个服务是否存在的解决方法
- 解决在windows环境中编写shell脚本,在Linux运行出错的问题
- Jmeter录制复杂页面脚本时Jvm崩溃或者栈溢出问题的解决
- 【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!
- 通过sudo解决php执行shell脚本的权限问题
- Linux学习-->如何通过Shell脚本实现发送邮件通知功能?
- QT 编译通过但是运行出现程序异常结束或者crashed的问题 在QT creator中最佳解决办法
- 如何停止正在运行的job(解决job不能删除或修改的问题)
- Git学习-->如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器?
- 编译类【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!
- 朋友的一个问题:Linux开机如何自动运行自己编写好的shell脚本
- 【COCOS2DX-LUA 脚本开发之十四】解决自定义CPP类通过TOLUA++ BINDING LUACOCOS2D后编译到ANDROID运行黑屏(没有调用自定义CPP类)的问题!
- WPF开发中遇到的问题及解决系列(二):如何获取通过binding生成的ComboBox或者ListBox等的Item
- Appium基础篇4-如何解决每次运行脚本都安装apk的问题