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.

加锁过程

  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

0 0
原创粉丝点击