我有一个 cron 作业,需要以 root 身份运行,并且需要 bash 而不是默认的 sh shell。
crontabroot
中还有其他运行良好的作业,我不想冒险通过SHELL=/bin/bash
在文件顶部指定来破坏这些作业crontab
。
如何指定我的 cron 作业使用 bash 运行,而不更改用于其他现有作业的 shell?
我觉得像这样的一行0 * * * * SHELL=/bin/bash myjob
可能可以解决问题,但我在 CentOS 的 cron 文档中找不到任何提到的内容。
我还认为也许在我的工作之前设置 SHELL 变量(这将是文件中的最后一个)可能会起作用,但找不到有关环境变量放置效果以及它们是否按文档顺序分配的文档或者只是被认为是全局的,无论其职位如何(或者如果不是在所有工作之前,可能会产生错误)。
我可以根据作业指定 shell 吗?
答案1
指定 shell 的最直接方法就是调用该 shell 的可执行文件。例如,如果您想执行名为myjob
using 的命令bash
,则可以使用类似以下命令行的内容:
/bin/bash -c 'myjob'
相应的 crontab 条目可能如下所示:
0 * * * * /bin/bash -c 'myjob'
或者,如果myjob
是脚本,您可以使用类似以下命令行的内容:
/bin/bash '/path/to/myjob'
相应的 crontab 条目将如下所示:
0 * * * * /bin/bash '/path/to/myjob'
答案2
如果myjob
是 shell 脚本,请确保它是可执行的,并且它的#!
-line 为脚本文件指定了正确的解释器(例如#!/bin/bash
)。就这样。
如果它是一系列命令,我建议放置那些在bash
脚本中,使用适当的#!
-line,如上所述。
这样,您实际上不必太担心使 crontab 条目正确的特殊性(除了在什么时间运行脚本)。当您在 Python 或 Perl 或其他 shell 变体中重新实现脚本时,它还消除了更新 cronjob 的需要。