Shell中,实现单一实例(译)
来源:互联网 发布:adobe xd windows 编辑:程序博客网 时间:2024/06/07 00:35
代码
#!/bin/bash## Copyright (C) 2009 Przemyslaw Pawelczyk <przemoc@gmail.com>#### This script is licensed under the terms of the MIT license.## https://opensource.org/licenses/MIT## Lockable script boilerplate### HEADER ###LOCKFILE="/var/lock/`basename $0`"LOCKFD=99# PRIVATE_lock() { flock -$1 $LOCKFD; }_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }# ON START_prepare_locking# PUBLICexlock_now() { _lock xn; } # obtain an exclusive lock immediately or failexlock() { _lock x; } # obtain an exclusive lockshlock() { _lock s; } # obtain a shared lockunlock() { _lock u; } # drop a lock### BEGIN OF SCRIPT #### Simplest example is avoiding running multiple instances of script.exlock_now || exit 1# Remember! Lock file is removed when one of the scripts exits and it is# the only script holding the lock or lock is not acquired at all.
加锁过程
"/var/lock/
`basename $0
`"
: 根据当前脚本的名字,在/var/lock/
目录下创建一个临时文件eval "exec $LOCKFD>\"$LOCKFILE\"";
: 打开这个临时文件,并获得句柄(LOCKFD
)_lock xn
: 使用flock -xn $LOCKFD
获得文件句柄的排它锁(Exclusive Lock
),如果获取失败,则状态码非0
解锁过程
trap _no_more_locking EXIT
: 捕获脚本的退出事件(EXIT),当脚本退出时(Ctrl + C
、kill -s TERM $PID
、正常结束等, 不包括kill -9 $PID
),会执行_no_more_locking
_lock u; _lock xn && rm -f $LOCKFILE;
: 解锁,加锁(成功后)删除临时文件。_lock u
解锁,以便其他进程对临时文件加锁;_lock xn && rm -f $LOCKFILE
如果加锁成功,则删除临时文件,否则不删,因为此时有其他进程正在锁住临时文件。
注意
The flock command is part of the util-linux-ng package and is available from ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/. macOS系统中没有这个命令
参考
原文: What is the best way to ensure only one instance of a Bash script is running?
Repo: przemoc/lockable_script_boilerplate.sh
0 0
- Shell中,实现单一实例(译)
- vb中实现单一实例模式
- C++实现单一实例
- Python 实现程序的单一实例
- Python 实现程序的单一实例
- 使用 IBM 中间件实现 SaaS 解决方案,第 4 部分: 单一实例多租户应用程序中资源共享的设计模式
- 使用 IBM 中间件实现 SaaS 解决方案,第 4 部分: 单一实例多租户应用程序中资源共享的设计模式
- .Net平台应用程序单一运行实例代码实现
- 利用专有命名空间实现单一实例源代码注释
- Golang1.7.3实现启动单一实例代码片段
- 单一实例singleton
- Singleton 单一实例
- shell编程实例--实现累加
- Makefile中使用shell实例
- 如何实现单一用户单一机子登录
- 实现单一进程
- php 单一入口实现
- 用dispatch_once创建单一实例
- Application Cache
- 安装虚拟机,配置Ubuntu系统,将ubuntu server 14.04系统安装到u盘,作为引导盘
- 43. Multiply Strings
- Ajax 与异步数据传输
- Eclipse查看Jar包中的源码配置和下载(超简单)
- Shell中,实现单一实例(译)
- 独立模式(Standone Mode)启动Spark
- String KMP算法 JAVA实现
- JQuery初识
- Java/Jsp中让数值不使用科学计数法显示的解决方案
- 【私人手册】Markdown语法
- mybatis 基本类型的if条件判断问题 There is no getter for property named 'xxx' in 'class Java.lang.Integer'
- [ML]机器学习之线性回归
- snort 源码分析之模式匹配引擎