如何避免shell脚本被同时运行多次
来源:互联网 发布:维密摔倒后果 知乎 编辑:程序博客网 时间:2024/05/29 09:35
转自:http://www.etwiki.cn/linux/2786.html
比如说有一个周期性(cron)备份mysql的脚本,或者rsync脚本,
如果出现意外,运行时间过长,
很有可能下一个备份周期已经开始了,当前周期的脚本却还没有运行完,
显然我们都不愿意看到这样的情况发生。
其实只要对脚本自身做一些改动,就可以避免它被重复运行。
#!/bin/bash
LOCK_NAME="/tmp/my.lock"
if [[ -e $LOCK_NAME ]] ; then
echo "re-entry, exiting"
exit 1
fi
### Placing lock file
touch $LOCK_NAME
echo -n "Started..."
### 开始正常流程
### 正常流程结束
### Removing lock
rm -f $LOCK_NAME
echo "Done."
当脚本开始运行时, 创建 /tmp/my.lock文件,
这时如果再次运行此脚本,发现存在my.lock,就退出,
脚本运行结束时删除这个文件。
大多数情况下,这样做都没有什么问题。
意外1) 如果同时运行二次此脚本, 二个进程都会发现my.lock不存在,然后都可以继续执行。
意外2) 如果脚本在运行过程中意外退出, 没有来得及删除 my.lock文件, 那么就悲剧了。
修改如下:
#!/bin/bash
LOCK_NAME="/tmp/my.lock"
if ( set -o noclobber; echo "$$" > "$LOCK_NAME") 2> /dev/null;
then
trap 'rm -f "$LOCK_NAME"; exit $?' INT TERM EXIT
### 开始正常流程
### 正常流程结束
### Removing lock
rm -f $LOCK_NAME
trap - INT TERM EXIT
else
echo "Failed to acquire lockfile: $LOCK_NAME."
echo "Held by $(cat $LOCK_NAME)"
exit 1
fi
echo "Done."
set -o noclobber 的意思:
If set, bash does not overwrite an existing file with the >, >&, and <> redirection operators.
这样就能保证my.lock只能被一个进程创建出来。比touch靠谱多了。
trap 可以捕获各种信号,然后做出处理:
INT 用来处理 ctrl+c取消脚本执行的情况。
TERM 用来处理 kill -TERM pid 的情况。
EXIT 不清楚
另外,对于 kill -9 无效。。
还记得N年前,在php群里面,草人也问过这个问题,
我们给的答案是 ps aux|grep filename |wc -l ,哈哈,真2。
- 如何避免shell脚本被同时运行多次
- shell脚本是防止多次运行
- 如何避免同一个文件被include多次
- 如何避免同一个文件被include多次
- 如何避免点击事件被执行多次
- shell脚本程序 如何运行
- shell 同时运行脚本里多个互不干扰的指令
- 避免重复同时执行shell
- Shell脚本有几种运行方式,如何使用?
- 如何写一个shell脚本并运行
- linux中如何运行shell脚本
- shell脚本如何运行redis命令
- 如何在双击后运行shell脚本
- 如何在双击后运行shell脚本
- 用fuser避免一个脚本被同时执行
- 同时运行两个脚本
- 避免多次运行同一个程序进程
- 如何让Perl脚本同时只运行一个实例
- Ionic开发者小贴士
- spring+mybatis整合
- The Swift Programming Language
- Toolbar去除左侧空白,右侧空白,两侧空白
- Android 开发者的 RxJava 学习一,走进RxJava
- 如何避免shell脚本被同时运行多次
- 程序员这样优化简历,已投制胜
- Java-第6章 访问权限控制
- testadsf
- 包含min函数的栈
- Mac 获取设备型号/版本
- Harris 角点检测算法原理
- 前端人员必须了解的各种浏览器
- The Swift Programming Language