您的位置首页  散文随感

真没想到lockdir(lockdir破解版)

如何确保脚本一次只运行一个实例(互斥锁)?为了确保脚本一次只运行一个实例,我们需要采取一种互斥锁的方法。其中一种方法是使用"锁&quo

真没想到lockdir(lockdir破解版)

 

如何确保脚本一次只运行一个实例(互斥锁)?

为了确保脚本一次只运行一个实例,我们需要采取一种互斥锁的方法其中一种方法是使用"锁",允许多个进程同时尝试获取锁,但只有一个进程会成功在Shell脚本中,我们如何实现这一点呢?有人建议创建一个锁文件并检查其是否存在:。

# 锁定示例 -- 错误的方式 lockfile=/tmp/myscript.lock if [ -f "$lockfile" ]; then# 锁已被持有printf >&2 无法获取锁定,放弃:%s\n

"$lockfile"exit 0 else# 没有进程拥有锁 > "$lockfile"# 创建文件#...继续脚本fi然而,这个例子是不起作用的,因为存在竞争条件(Race Condition):在检查和创建文件之间存在一个时间窗口,在此期间其他程序可能会执行操作。

假设两个进程同时运行这段代码,它们都检查锁文件是否存在,并且都得到结果:它不存在现在两个进程都认为自己已经获取了锁,这会导致等待的问题我们需要一种原子的检查和创建操作,幸运的是,有一种方法可以实现,那就是使用mkdir命令来创建目录:。

# 锁定示例 -- 正确的方式# Bourne lockdir=/tmp/myscript.lock if mkdir -- "$lockdir"; then# 目录不存在,但成功创建printf >&2

成功获取锁定:%s\n"$lockdir"# 继续脚本elseprintf >&2 无法获取锁定,放弃:%s\n"$lockdir"exit 0 fi在这个例子中,即使两个进程同时调用mkdir,最多只有一个进程能够成功。

这种检查和创建的原子性在操作系统内核级别得到了保证除了使用mkdir之外,我们还可以使用创建符号链接的程序ln -s第三种可能性是让程序使用rm删除一个已存在的锁文件,然后在退出时通过重新创建文件释放锁。

需要注意的是,我们不能使用mkdir -p来自动创建缺少的路径组件,因为如果目录已经存在,mkdir -p不会返回错误,但这是我们依赖的特性,以确保互斥性为了改进示例,让我们自动删除锁文件,以确保在脚本完成时释放锁:。

# POSIX(可能是Bourne) lockdir=/tmp/myscript.lock if mkdir -- "$lockdir"; thenprintf >&2 成功获取锁定\n# 当脚本完成或接收到信号时,删除lockdir

traprm -rf -- "$lockdir" 0 # 脚本结束时删除目录# 可以选择在此目录中创建临时文件,因为# 它们将被自动删除: tmpfile=$lockdir/filelist

elseprintf >&2 无法获取锁定,放弃:%s\n"$lockdir"exit 0 fi这个示例更好一些然而,仍然存在一个问题,即在脚本被未捕获的信号终止(如信号9,SIGKILL)时,可能会保留一个过时的锁,或者可能会导致死锁。

为了解决这个问题,我们使用了trap命令,在脚本结束时自动删除锁目录这样,无论是脚本正常完成还是被中断,都可以确保锁文件被释放以上是如何确保脚本独占执行的一种方法然而,请注意,这种方法只能在同一台机器上的不同进程之间提供互斥性。

如果在多台机器上运行脚本,您可能需要使用其他方法,例如使用网络锁服务或分布式锁更多如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看

《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。

专栏Shell脚本编程最佳实践作者:SuperOps9.9币69人已购查看

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186