使用 bash 脚本执行 cron 作业有什么好处?

使用 bash 脚本执行 cron 作业有什么好处?

据我了解,你可以通过编辑来编写你的 cron

crontab -e

我找到了几个来源,它们在 cron 作业中引用 bash 脚本,而不是逐行编写作业。

唯一的好处是可以使用 bash 脚本将多个任务合并到一个 cron 作业中吗?


给新手的附加问题:编辑 crontab -e 指的是一个文件,对吗?我注意到,如果我打开 crontab -e 并关闭而不进行编辑,当我再次打开文件时,会有一个不同的数字扩展名,例如:

"/tmp/crontab.XXXXk1DEaM" 0L, 0C

我认为 crontab 存储在 /var/spool/cron 或 /etc/crontab 中?

为什么要将 cron 存储在 tmp 文件夹中?

答案1

这取决于你从事什么工作。

cron 不会为您提供真正的脚本环境,因此,如果您要执行的操作比简单地调用几个命令更复杂,则可能需要使用 cron 来调用脚本。您还可以处理脚本中的变量扩展等问题,这在 cron 环境中很难甚至不可能完成。

运行时看到的临时文件crontab -e就是:退出编辑器会话后将被清除的临时文件。通过此方法编辑的实际 crontab 最终位于 /var/spool/cron 中。

实际上,由于这些都是相对基本的 unix 特定问题,因此unix.stackexchange.com事情的一方面,这可能会更有帮助。

答案2

好的,对于第一个问题:有几个理由在你的 cronjob 中使用 bash 脚本:

正如您所提到的,您可以将许多命令合并到一个 bash 脚本中。这比仅仅将一大段 crontab 行集中在一起更具可读性,尤其是因为逻辑流程更加明显。比较:

command1 >/tmp/foo && command2 || command3

对阵

if command1 >/tmp/foo
then
  command2
else
  command3
fi

在 crontab 中调用脚本的另一个原因是,您可以调用 bash 以外的其他程序。例如,您可以调用 perl 脚本,甚至是 php 脚本。

另外,假设您有一些要在 cron 之外调用的逻辑。那么,将该逻辑放在服务器上安装的单独脚本中也是有意义的。您可以根据需要在命令行上运行该脚本,也可以从 crontab 调用它。

最后,请注意,crontabs 中的引用确实很奇怪。典型的例子是 crontabs 会吃掉百分号。如果您在 crontab 行中放置“%”,则实际上必须将其加倍(“%%”),否则 cron 会吃掉裸露的百分号并让您感到困惑。

基本上,将 cronjob 包装在脚本中更安全(更标准的引用/转义)且更灵活。任何长度超过一两个命令的 cronjob 可能都应该移到单独的脚本中。

第二个问题很简单:当您编辑 crontab 时,您不会直接编辑 /var/spool 下的文件。相反,该命令会将您的 crontab 文件复制到 /tmp 中的临时文件。临时文件名的一部分是随机字符串,旨在减少两次调用尝试编辑 /tmp 中同一文件crontab -e的机会。crontab -e

出于各种原因,编辑临时文件更安全。一个原因是,如果编辑过程崩溃,原始文件不会受到影响,仍可使用。另一个原因是,它允许系统在替换旧 crontab 之前检查新 crontab 是否存在语法错误。

如果我能够在输入整个条目时不说一次 cornjob,那我会感到惊讶。

相关内容