【发布时间】:2017-11-27 18:23:38
【问题描述】:
我试图只运行一个程序实例,这是我的 运行脚本,它是从 crontab 调用的:
#!/bin/bash
exec 9>./lockfile
if ! flock -n 9 ; then
echo "another instance of $0 is running";
exit 1
fi
node $(dirname $0)/init.js
crontab中的行如下:
*/5 * * * * /bin/bash /path/to/proyect/runner.sh >> /path/to/proyect/logs/output.log 2>> /path/to/proyect/logs/error.log
奇怪的是,在我终止进程后,文件保持锁定状态
【问题讨论】:
-
锁绑定到一个单独的inode。如果有人运行了,比如说,
rm ./lockfile,那么这会将文件句柄打开的 inode 从文件系统中解开。听起来很熟悉? -
如果你的 cron 在单独的文件系统命名空间中运行(systemd 等工具支持),它也可能有一组不同的工作目录,而不是在它之外可见。确定 shell 访问您的系统将是微不足道的,但尝试通过问答式会话跟踪所有变量可能会有点痛苦。
-
...另外,错误,愚蠢的问题,但是当您的 cron 作业运行时,您是否肯定知道
.是哪个目录?我想知道您是否持有/lockfile,并且您在 cron 之外的各种测试一直在修改不同目录中的lockfile。 -
无论如何——我建议确保你将stderr重定向到你实际看到的地方,这样你就可以看到
flock(或前面的exec命令)发出的任何错误消息在 cron 作业执行期间;然后类似地记录stat ./lockfile的输出,并将inode 编号与您在cron 之外获得的编号进行比较。 -
对不起@CharlesDuffy,不了解有关 inode 的部分。我已将输出重定向到我在调试所有这些时正在查看的文件