确保
的最简单方法是什么?make target
不会同时运行?如果两个进程同时运行make target
,则两个进程都会运行目标并且可能会相互踩到脚趾。
一个shell代码段,例如
dotlockfile target.lock || exit 1
trap "dotlockfile -u target.lock" EXIT
make target
运行良好:如果两个进程同时运行该代码段,其中一个将获得锁定,另一个将等待它完成。当第一个进程完成时,另一个进程运行make target
,它将立即返回并且不执行任何操作,因为目标已经构建完毕。
我希望有一种更简单的方法来做同样的事情。
答案 0 :(得分:0)
以下(在您的makefile中)应该会显着降低多个进程发生冲突的可能性:
target:
@if [ -f making.target ]; then \
echo "Already making target..."; \
exit 1; \
else \
touch making.target; \
<do whatever is needed to make target>; \
rm making.target; \
fi
您可以通过将<do whatever is needed to make target>
替换为sleep 10
来轻松测试,并尝试make target
两次,在启动第二个时,等待和不等待第一个。请注意,您也可以跳过配方而不是中止整个make运行:只需删除exit 1
行。
答案 1 :(得分:0)
更简单的解决方案是使用flock
,如下所示:
flock /tmp/target.lock make target
如果在另一个持有锁的情况下运行此命令,它将等待它完成并在释放锁时运行。或者,如果意图是在make target
已经运行的情况下放弃,可以像这样使用-n
标志:
flock -n /tmp/target.lock make target