【发布时间】:2018-04-09 12:53:37
【问题描述】:
我在centos 上使用bash 和flock。
通常我会运行cd /to/my/dir && python3.6 runcommand.py
然后我们将它添加到 cron 并且不想输出所以添加 > /dev/null 2>&1
并在它之前添加一个flock以防止多个实例,如下所示:
flock -n ~/.my.lock cd /to/my/dir && python3.6 runcommand.py > /dev/null 2>&1
问题
这只集群cd /to/my/dir然后执行python3.6(通常没有集群)还是集群bash命令的完整行(所以两者)并且仅在python3.6 runcommand.py也完成时解锁?
从我找到的人和例子中不清楚。
【问题讨论】:
-
&&是一个 shell 构造,所以flock不知道它。 -
flock甚至不是由 shell 给出你的整个命令——它不能“理解”或“支持”它从未见过的东西。它得到的只是flock -n ~/.my.lock cd /to/my/dir(~已经替换为实际的目录名称);它甚至看不到其他任何东西。 -
(这些都不是
flock所特有的——如果你正在运行,比如说echo cd /to/my/dir && python3.6 runcommand.py,那么echo也只会在@987654335之前被赋予一个命令@)。 -
(更迂腐一点:
flock得到的是一个看起来像这样的参数向量:char*[]{"flock", "-n", "/home/whatever/.my.lock", "cd", "/to/my/dir", NUL}-- 即它甚至没有得到原始字符串,而是一个shell 在解析命令行时创建的单独 C 字符串数组)。 -
建议:不要在 crontab 中添加逻辑。编写带有逻辑的脚本并调用该脚本。 Crontabs 应该是绝对微不足道的,IMO 甚至没有任何重定向。但是脚本中的重定向。