【问题标题】:Does flock understand && command for multiple bash commands?群是否理解多个 bash 命令的 && 命令?
【发布时间】: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 甚至没有任何重定向。但是脚本中的重定向。

标签: bash flock


【解决方案1】:

Shell 以这种方式解释您的命令:

flock -n ~/.my.lock cd /to/my/dir && python3.6 runcommand.py > /dev/null 2>&1
  • 第 1 步:运行 flock -n ~/.my.lock cd /to/my/dir 部分
  • 第 2 步:如果第 1 步中的命令以非零值退出,则跳过第 3 步
  • 第 3 步:运行 python3.6 runcommand.py > /dev/null 2>&1 部分

所以,flock&& 或其右侧没有任何业务关系。

你可以这样做:

touch ./.my.lock # no need for this step if the file is already there and there is a potential that some other process could lock it
(
  flock -e 10
  cd /to/my/dir && python3.6 runcommand.py > /dev/null 2>&1
) 10< ./.my.lock

在 Unix 和 Linux 网站上查看这篇文章:

【讨论】:

  • (cd /to/my/dir &amp;&amp; exec flock -n ~/.my.lock python 3.6 runcommand.py &gt;/dev/null 2&gt;&amp;1) 也足够了。
【解决方案2】:

我必须在 crontab 中执行此操作。这是我的方式-

*/30 * * * * cd /home/myfolder/ /usr/bin/flock -w 0 /home/myfolder/my-file.lock && python my_script.py > /dev/null 2>&1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多