我想通过执行以下脚本对我的主目录进行每日备份(我可以写入/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)。您的系统上尚未配置电子邮件,即使用于本地传递也是如此。sh
bash
-e
man set
cron
cron
通过 运行的作业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。
感谢大家,迪克