我想要一个脚本(它在我的shell中设置变量):
source foo.sh args
但是在flock下,所以一次只能运行一个实例(它会执行大量的磁盘访问,我希望确保序列化)。
$ source flock lockfile foo.sh args
-bash: source: /usr/bin/flock: cannot execute binary file
和
$ flock lockfile source foo.sh args
flock: source: Success
不起作用。
我缺少一些简单的语法吗?假设我无法编辑foo.sh以将锁定命令放入其中。
答案 0 :(得分:1)
您不能通过source
直接flock
脚本,因为它是一个外部命令,而source
是内置的shell。实际上你有两个问题:
flock
并不知道任何名为source
的命令,因为它内置于bash
flock
可以运行它,更改也不会影响调用shell的状态,因为它需要source
因为它在子进程中发生。 而且,将flock
传递给source
会失败,因为source
需要一个脚本。要做你想做的事,你需要用fd锁定。这是一个例子
#!/bin/bash
exec 9>lockfile
flock 9
echo whoopie
sleep 5
flock -u 9
同时在同一目录中运行此脚本的两个实例,您将看到一个等待另一个。