各位 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
Hello
cron 作业运行良好。如果我的 python 进程正在运行,我会收到消息。
另一方面,双管运行美好的直接在 shell 中。
所以在我看来它||
仅在 cron 作业中不起作用。
你能帮我找出原因吗?
谢谢!
答案1
我认为这里没有找到它不起作用的原因。
双管道“||”是 shell 表达式中的逻辑或运算符。
你的命令如下:
命令组&&命令组&&命令组3||cmd_group_4
例如:
A)
- *cmd_group_1* 执行失败 --> 退出代码将不等于零
- *cmd_group_4* 将被执行
B)
- *cmd_group_1*,*cmd_group_2*,*cmd_group3* 执行过程
- *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 中)