确保给定脚本只有一个实例正在运行的最简单/最好的方法是什么-假设它是Linux上的Bash?
目前我正在做的是:
ps -C script.name.sh > /dev/null 2>&1 || ./script.name.sh
但它有几个问题:
当然,我可以编写自己的pidfile处理程序,但我觉得应该有一种简单的方法。
发布于 2009-11-11 21:25:40
如果所有用户的脚本都相同,则可以使用lockfile
方法。如果您获得了锁,则继续,否则显示一条消息并退出。
举个例子:
[Terminal #1] $ lockfile -r 0 /tmp/the.lock
[Terminal #1] $
[Terminal #2] $ lockfile -r 0 /tmp/the.lock
[Terminal #2] lockfile: Sorry, giving up on "/tmp/the.lock"
[Terminal #1] $ rm -f /tmp/the.lock
[Terminal #1] $
[Terminal #2] $ lockfile -r 0 /tmp/the.lock
[Terminal #2] $
在获得/tmp/the.lock
之后,您的脚本将是唯一可以执行的脚本。完成后,只要移除锁即可。在脚本形式中,这可能类似于:
#!/bin/bash
lockfile -r 0 /tmp/the.lock || exit 1
# Do stuff here
rm -f /tmp/the.lock
发布于 2009-12-31 21:57:42
建议锁定已经使用了很长时间,并且可以在bash脚本中使用。我更喜欢简单的flock
(来自util-linux[-ng]
)而不是lockfile
(来自procmail
)。并始终记住在这些脚本中退出时的陷阱(sigspec == EXIT
或0
,捕获特定信号是多余的)。
在2009年,我发布了我的可锁定脚本样板(最初可以在我的维基页面上找到,现在可以在gist上找到)。将其转换为每个用户一个实例是很容易的。使用它,您还可以轻松地为其他需要一些锁定或同步的场景编写脚本。
为了方便起见,下面是前面提到的样板。
#!/bin/bash
# SPDX-License-Identifier: MIT
## 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.
发布于 2013-07-05 09:46:05
我认为flock
可能是最简单(也是最令人难忘的)变体。我在cron作业中使用它来自动编码dvds和cds
# try to run a command, but fail immediately if it's already running
flock -n /var/lock/myjob.lock my_bash_command
使用-w
表示超时,或保留out选项等待,直到锁被释放。最后,手册页为多个命令显示了一个很好的示例:
(
flock -n 9 || exit 1
# ... commands executed under lock ...
) 9>/var/lock/mylockfile
https://stackoverflow.com/questions/1715137
复制相似问题