双管道“||”在 cron 作业中不起作用

双管道“||”在 cron 作业中不起作用

各位 SU 朋友,

我正在尝试运行一个看门狗 cron 作业来确保进程正在运行(DreamHost 不断终止进程)。我受到了这个的启发SU 问题

然而,双管||似乎不起作用。

我的 cron 条目:

# watchdog MAILTO="[email protected]" @daily . ~/.bashrc && cd /home/chucknorris/workingfolder/ && pgrep -f "python /home/chucknorris/workingfolder/web2py.py -K LLBean" > /dev/null || echo Hello

问题是:如果 python 进程没有运行,我就收不到发送给我的“Hello”消息。

如果我换成单管|

pgrep -f "python /home/chucknorris/workingfolder/web2py.py -K LLBean" > /dev/null | echo Hello

Hellocron 作业运行良好。如果我的 python 进程正在运行,我会收到消息。

另一方面,双管运行美好的直接在 shell 中。

所以在我看来它||仅在 cron 作业中不起作用。

你能帮我找出原因吗?

谢谢!

答案1

我认为这里没有找到它不起作用的原因。

双管道“||”是 shell 表达式中的逻辑或运算符。

你的命令如下:

命令组&&命令组&&命令组3||cmd_group_4

例如:
A)

  1. *cmd_group_1* 执行失败 --> 退出代码将不等于零
  2. *cmd_group_4* 将被执行

B)

  1. *cmd_group_1*,*cmd_group_2*,*cmd_group3* 执行过程
  2. *cmd_group_4* 将不会被执行

编辑:
我测试了下面提到的 cron 中的 crontab 条目并且它正常工作: * * * * * aaa || echo "hello" >>/tmp/test aaa 是不存在的命令,因此该命令失败并且 hello 将被写入 /tmp/test

答案2

@period 替代了日期和时间规范;恕我直言,cron 应该在系统日志中生成一个错误,提示“.”是无效用户。除非这已经是一个用户 crontab。

您的问题没有提供有关上下文的任何详细信息: - 分布 - 版本 - 此 cron 的存储位置(路径对于某些方面至关重要) - 文件的名称(名称也很重要) - cron conf 文件

具体来说,您提供的摘录未指定使用的 shell;并且您正在加载 bashrc 文件,而 bash 几乎从来都不是使用的 shell。因此,根据您的 bashrc 文件的内容,在尝试执行点的级别上,行为已经是不可预测的。

根据 shell 的不同,&& 可能不受支持。

关于您那行代码的最后一部分从未被解释,可能是因为它从未被 shell 读取。事实上,大多数 cron 实现都有一个最大长度;并且此限制之后的任何字节都将被忽略。就我所遇到的情况而言,此限制可能因实现而异,在 128 到 1024 字节之间。最常见的值是 192 和 256。当然,cron 不会在系统日志中报告此问题(即使在重新加载时也不会)。

由于您没有提供任何上下文,因此您必须自己阅读手册页,具体取决于您的发行版、您的版本和所使用的 cron 包。

我知道我并没有真正回答这个问题,因为问题的表述含糊不清,无法得到答案。

您可以使用较短的行来测试全局语法,例如:

* * * * * root /bin/true && echo true || echo false
* * * * * root /bin/false && echo true || echo false

然后将代码放入脚本中(我将用户脚本放在 ~/.sh/ 中,将系统脚本放在 /usr/local/bin 中(用于用户可访问的脚本),将用户不可访问的脚本放在 /usr/local/sbin 中)

相关内容