将 bash 脚本用于 cron 作业有什么好处?

Alx*_*ejo 1 bash cron

根据我的理解,您可以通过编辑来编写您的 crons

crontab -e
Run Code Online (Sandbox Code Playgroud)

我发现有几个来源在 cron 作业中引用了 bash 脚本,而不是为行编写作业行。

您可以使用 bash 脚本将许多任务合并为一个 cron 作业的唯一好处是什么?


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

"/tmp/crontab.XXXXk1DEaM" 0L, 0C
Run Code Online (Sandbox Code Playgroud)

我虽然 crontab 存储在 /var/spool/cron 或 /etc/crontab 中?

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

cjc*_*cjc 7

这取决于你在做什么工作。

cron 没有给你一个真正的脚本环境,所以,如果你做的事情比简单地调用几个命令更复杂,你可能想使用 cron 来调用脚本。您还可以在脚本中处理诸如变量扩展之类的事情,这在 cron 环境中即使不是不可能也很难做到。

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

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

  • /var/spool/cron/ 是一个目录。在那里每个用户都有自己的文件。 (2认同)

Phi*_*ack 5

好的,对于第一个问题:有几个原因可以为您的 cronjob 使用 bash 脚本:

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

command1 >/tmp/foo && command2 || command3
Run Code Online (Sandbox Code Playgroud)

对比

if command1 >/tmp/foo
then
  command2
else
  command3
fi
Run Code Online (Sandbox Code Playgroud)

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

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

最后,请注意在 crontabs 中引用真的很奇怪。典型的例子是 crontabs 吃百分号。如果你在 crontab 行中放了一个 '%',你实际上必须将它加倍('%%'),否则 cron 会吃掉裸百分号并混淆你的 jebebus。

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

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

由于各种原因,编辑临时文件更安全。一是如果编辑过程崩溃,原始文件将保持不变且可用。另一个是它允许系统在替换旧的 crontab 之前检查新的 crontab 是否存在语法错误。

此外,如果我设法输入整个条目而不说一次“cornjob”,我也会感到惊讶。