前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >确保同一时间只有一个shell脚本实例在运行的方法

确保同一时间只有一个shell脚本实例在运行的方法

作者头像
程序熵
修改2023-11-15 07:53:20
3380
修改2023-11-15 07:53:20
举报
文章被收录于专栏:技术汇技术汇

问:

有什么快速简便的方法可以确保在给定的时间内只有一个shell脚本实例在运行?

答:

方法一 使用flock(1)在文件描述符上创建一个独占锁。

代码语言:javascript
复制
#! /bin/bash

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200 || exit 1

  # 在这里放置脚本的主逻辑部分

) 200>/var/lock/.myscript.exclusivelock

这样可以确保 ( 和 ) 之间的代码一次只由一个进程运行,并且该进程不会为获取锁而等待太长时间。

flock命令是Linux的文件锁命令,可以通过一个锁文件,来控制在shell中逻辑的互斥性。 flock命令的常见选项包括:

  • -s:获取共享锁,有时称为读锁。
  • -x:获取独占锁,有时称为写锁。这是默认值。
  • -n:获取锁失败时立即返回,而不是等待锁被释放。
  • -w:等待锁释放的时间,单位为秒。

方法二 是一个使用锁定文件并将PID回显到其中的实现。

代码语言:javascript
复制
SCRIPT_NAME=$(basename "$0")
LOCKFILE=/tmp/${SCRIPT_NAME}.lock
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
    echo "already running"
    exit
fi

# make sure the lockfile is removed when we exit and then claim it
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}

# 在这里放置脚本的主逻辑部分
sleep 100

rm -f ${LOCKFILE}

这里的技巧是kill -0,它不传递任何信号,只是检查具有给定PID的进程是否存在。此外,对trap的调用将确保锁定文件被删除,即使你的进程被杀死(kill -9除外)。

参考文档:

相关阅读:

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-12,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com