无法让 crontab 按预期工作

无法让 crontab 按预期工作

我想通过执行以下脚本对我的主目录进行每日备份(我可以写入/home):

   #!/bin/sh -e
   cd /home
   ls -l 
   rm -f silbar.tar.gz
   echo "starting tar"
   tar -czf silbar.tar.gz silbar
   cd ./silbar
   echo "done with tar"
   beep

为此,我通过输入 ~$ crontab -e 创建了我的个人 crontab 文件,并添加了以下内容(唯一不是注释的行)

30 6 * * * mybackup.script 

假设我的 crontab 将在我的主目录中运行。

但什么也没发生。执行 ~$ grep CRON /var/log/syslog 会显示除了 root 之外的错误,以下是错误信息:

8 月 30 日 06:30:01 Puma CRON[100126]: (silbar) CMD (mybackup.script )

8 月 30 日 06:30:01 Puma CRON[100125]: (CRON) 信息(未安装 MTA,丢弃输出)

那么,我做错了什么?MTA 到底是什么?

答案1

您可能需要在 cronjob 中输入脚本的完整路径。

Cronjobs 在几乎空的环境中运行。因此,可能找不到可执行文件。脚本中的命令也是如此:提供命令的完整路径,或在脚本中设置 PATH 变量。

答案2

通过以 开头,您会导致脚本以(在我看来更好)#!/bin/sh -e运行,并在出现任何错误时退出 ( ),因此无法处理错误。您的脚本失败,并试图通过电子邮件向您发送日志。找不到邮件传输代理 (MTA)。您的系统上尚未配置电子邮件,即使用于本地传递也是如此。shbash-eman setcroncron

通过 运行的作业cron,或者systemd启动脚本不会在与桌面相同的运行时环境中运行。systemd启动脚本以 运行root。您的任何PATH更改或其他环境变量设置都不会~/.bashrc自动传播到您的cron作业。例如,没有$DISPLAY,因此 GUI 程序需要特殊处理(阅读man xhost)。

cron人们可以在crontab文件 Read中为所有作业设置环境变量man 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于command该行的一部分crontab默认由 解释/bin/sh,其语法比 更简单/bin/bash,因此我建议command调用一个bash脚本(可执行、已安装、以 开头#!/bin/bash)来设置环境,然后调用所需的程序。

答案3

哇!user535733、Rinzwind、Vanadium 和 waltinator 的回答非常有用。我现在按照建议使用 bash 和完整路径来工作。备份现在转到闪存驱动器(无论如何,这也是我想要它去的地方)而不是 /home。

感谢大家,迪克

相关内容