Man*_*nde 27 unix bash shell concurrency semaphore
我正在寻找shell脚本中的互斥/信号量/并发机制.请考虑以下情况:除非"a"用户未关闭共享文件,否则"b"用户无法打开/更新它.我只是想知道如何在shell脚本中实现互斥,信号量,关键部分等.
哪个是在shell脚本中实现锁定机制[文件级别]的最简单方法?
Pau*_*bel 39
该BashFAQ 通过shellter注意到有一些很好的例子.基本的想法,我在这里移动所以页面是自包含的,是使用同时测试和设置的操作:mkdir
如果目录存在,mkdir将失败,如果不存在则将失败.这是一个原子操作,您可以像这样使用它来在shell脚本中执行互斥(来自上面的BashFAQ)
# Bourne
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
# continue script
else # failed to create the directory, presumably because it already exists
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
请点击此链接了解有关清理和其他项目的更多详细信息.
she*_*ter 13
有关Bash中文件锁定的讨论,请参阅BashFAQ和ProcessManagment.
将您的问题标记为shell(仅限)可以限制可以帮助您的人数.你可能想添加unix,ksh,bash.
关于这个主题的问题/答案已经在SO上发布了很多
我希望这有帮助.
您可以使用该flock
实用程序锁定文件/将其用作互斥锁.
例:
#!/bin/sh -eu
#advanced bash stuff not needed
: >> lock #create a file if it doesn't exist
{
flock 3 #lock file by filedescriptor
echo $$ working with lock
sleep 2
echo $$ done with lock
} 3<lock
Run Code Online (Sandbox Code Playgroud)
用法示例:
./mx & ./mx & ./mx & #will run one at a time cuz of the lock
Run Code Online (Sandbox Code Playgroud)
(
回答马西莫的观点:
如果你不想硬编码一个文件编号(如果你不是硬编码0,1或2,它应该很少有问题,但无论如何),那么在bash中(但不是在一个只有POSIX的shell中)你可以分配让系统为你选择一个fd:
{
flock $fd
#...
} {fd}<lock
Run Code Online (Sandbox Code Playgroud)
)