【问题标题】:Bash: How to lock also when perform an outside scriptBash:执行外部脚本时如何锁定
【发布时间】:2012-11-13 05:50:25
【问题描述】:

这是我的 bash 代码:

(
flock -n -e 200 || (echo "This script is currently being run" && exit 1)
    sleep 10

    ...Call some functions which is written in another script...

    sleep 5

) 200>/tmp/blah.lockfile

我连续从两个 shell 运行脚本,只要第一个处于“睡眠 5”状态,一切正常,这意味着另一个没有启动。但是,当第一个轮到从另一个脚本(其他文件)执行代码时,第二个运行开始执行。

所以我在这里有两个问题:

  1. 我应该怎么做才能防止该脚本及其所有“子代”在脚本或其“子代”仍在运行时运行。 (除了“孩子”之外,我没有找到更合适的表达方式来运行另一个脚本,对此感到抱歉:)。

  2. 根据手册页,-n 导致进程在无法获得锁时退出,但据我所知,它只是等到它可以运行。我错过了什么?

【问题讨论】:

    标签: bash flock


    【解决方案1】:

    您的问题可能很普通。即,

    false || ( exit 1 )
    

    不会导致脚本退出。相反,exit 指示子shell 退出。因此,将您的第一行更改为:

    flock -n -e 200 || { echo "This script is currently being run"; exit 1; } >&2
    

    【讨论】:

    • 威廉的回答是正确的。但是,如果您必须使用子shell,则需要使用kill 命令杀死子shell 的父级。要获取父 shell 的 PID,您可以使用ps -p $$ -oppid=。但是,他的答案是更清洁的解决方案。
    • @anishsane bashkshdash 都有一个 $PPID 变量。不知道是不是真的很标准,但是好像很兼容,而且不用fork额外的进程。
    • 哦,我完全错过了这一点。但是我没有意识到:你只改变了一行,所以你的实现也使用了一个子 shell,那么你如何克服你描述的那个问题。 (我试过了,它奏效了,我很好奇它是怎么回事)。事实上,我并不完全理解为什么手册页建议使用 sub-shell,以及为什么不创建子 shell 对我不起作用(我收到错误消息“200 is a bad file-descriptor ”)。谢谢。
    • 不同之处在于我使用{}而不是()。括号中的命令在子 shell 中运行,但由括号分组的命令在当前 shell 中运行。你也不需要在子shell中运行你的整个进程,但是可以使用方括号来对命令进行分组,但是200>/tmp/lockfile必须适用于对flock的调用,如果你只是放弃分组,你会得到一个bad file descriptor 错误。
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 2019-10-06
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多