Shell中,实现单一实例(译)

代码

#!/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

# PUBLIC
exlock_now()        { _lock xn; }  # obtain an exclusive lock immediately or fail
exlock()            { _lock x; }   # obtain an exclusive lock
shlock()            { _lock s; }   # obtain a shared lock
unlock()            { _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.

加锁过程

  1. "/var/lock/`basename $0`": 根据当前脚本的名字,在/var/lock/目录下创建一个临时文件
  2. eval "exec $LOCKFD>\"$LOCKFILE\"";: 打开这个临时文件,并获得句柄(LOCKFD)
  3. _lock xn: 使用flock -xn $LOCKFD获得文件句柄的排它锁(Exclusive Lock),如果获取失败,则状态码非0

解锁过程

  1. trap _no_more_locking EXIT: 捕获脚本的退出事件(EXIT),当脚本退出时(Ctrl + Ckill -s TERM $PID、正常结束等, 不包括kill -9 $PID),会执行_no_more_locking
  2. _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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值