首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >确保只有一个Bash脚本实例在运行的最佳方法是什么?

确保只有一个Bash脚本实例在运行的最佳方法是什么?
EN

Stack Overflow用户
提问于 2009-11-11 21:21:25
回答 14查看 128.8K关注 0票数 127

确保给定脚本只有一个实例正在运行的最简单/最好的方法是什么-假设它是Linux上的Bash?

目前我正在做的是:

代码语言:javascript
复制
ps -C script.name.sh > /dev/null 2>&1 || ./script.name.sh

但它有几个问题:

  1. 它将检查置于script
  2. 之外,它不允许我从单独的帐户运行相同的脚本-我希望
  3. 只检查进程名称的前14个字符

当然,我可以编写自己的pidfile处理程序,但我觉得应该有一种简单的方法。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-11-11 21:25:40

如果所有用户的脚本都相同,则可以使用lockfile方法。如果您获得了锁,则继续,否则显示一条消息并退出。

举个例子:

代码语言:javascript
复制
[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之后,您的脚本将是唯一可以执行的脚本。完成后,只要移除锁即可。在脚本形式中,这可能类似于:

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

lockfile -r 0 /tmp/the.lock || exit 1

# Do stuff here

rm -f /tmp/the.lock
票数 121
EN

Stack Overflow用户

发布于 2009-12-31 21:57:42

建议锁定已经使用了很长时间,并且可以在bash脚本中使用。我更喜欢简单的flock (来自util-linux[-ng])而不是lockfile (来自procmail)。并始终记住在这些脚本中退出时的陷阱(sigspec == EXIT0,捕获特定信号是多余的)。

在2009年,我发布了我的可锁定脚本样板(最初可以在我的维基页面上找到,现在可以在gist上找到)。将其转换为每个用户一个实例是很容易的。使用它,您还可以轻松地为其他需要一些锁定或同步的场景编写脚本。

为了方便起见,下面是前面提到的样板。

代码语言:javascript
复制
#!/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.
票数 164
EN

Stack Overflow用户

发布于 2013-07-05 09:46:05

我认为flock可能是最简单(也是最令人难忘的)变体。我在cron作业中使用它来自动编码dvdscds

代码语言:javascript
复制
# try to run a command, but fail immediately if it's already running
flock -n /var/lock/myjob.lock   my_bash_command

使用-w表示超时,或保留out选项等待,直到锁被释放。最后,手册页为多个命令显示了一个很好的示例:

代码语言:javascript
复制
   (
     flock -n 9 || exit 1
     # ... commands executed under lock ...
   ) 9>/var/lock/mylockfile
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1715137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档