Skip to content

bash - 防止多实例同时运行脚本

使用文件锁,并且使用trap使得程序在任何时候崩溃退出都能unlock文件锁

#!/bin/bash

LOCKFILE="/var/lock/lockname.lock"
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 
if [ $? -ne 0 ]; then
    echo "Other user is running this script, please try again later!"
    exit 1
fi

# 脚本正文