在我的 sudo crontab 中,用 编辑sudo crontab -e
,我有:
# m h dom mon dow command
40 4 * * * /bin/bash /usr/bin/verify-miab-backup.sh
该脚本是:
#!/bin/bash
echo `date` > /home/mythbuntu/last_verify_miab_run.log
echo `id -u -n` >> /home/mythbuntu/last_verify_miab_run.log
export PASSPHRASE=$(cat /dozer/eandb/miab_22-04/secret_key.txt)
duplicity verify --log-file=/var/log/duplicity_backblaze_verify.log file:///dozer/eandb/miab_backblaze_backups/ /dev/null && echo "miab_last_verify_time_seconds `date +"%s"`" > /etc/grafana-text-file-collectors/miab_verify.prom
前两行是为了帮助尝试调试此问题。该/home/mythbuntu/last_verify_miab_run.log
文件包含:
Mon 10 Apr 04:40:01 BST 2023
root
因此看起来该文件正在由 root 运行。第三行从文件中获取密钥并将其存储到 PASSPHRASE 中(在 cron 作业中这样做可以吗?),然后第四行使用该密码来验证备份。
但是,如果我查看 .prom 文件:
$ cat /etc/grafana-text-file-collectors/miab_verify.prom
miab_last_verify_time_seconds 1681077406
该时间对应的是 2023 年 4 月 9 日星期日 22:56:46,这是我上次手动运行的时间。
使用 手动运行它sudo verify-miab-backup.sh
,一切都按预期工作。/home/mythbuntu/last_verify_miab_run.log
包含:
$ cat /home/mythbuntu/last_verify_miab_run.log
Mon 10 Apr 14:10:15 BST 2023
root
和
cat /etc/grafana-text-file-collectors/miab_verify.prom
miab_last_verify_time_seconds 1681132381
正如您所料,是 2023 年 4 月 10 日星期一 14:13:01。
我猜我明显在权限方面犯了错误,或者以 cron 作业中不允许的方式使用了变量,但我不知道在哪里。任何帮助都将不胜感激。
查看此处的先前问题:
- shell 脚本可以手动运行,但不能与 cron 一起使用, ——我已经使用了 Bash shebang 并专门用 bash 调用,以确保不会被任何“bashisms”所困扰。
- 我使用了此处建议的文件的完整路径:Shell 脚本本身运行良好,但不能在 cron 中运行
- 我在命令前添加了 /bin/bashBash 脚本运行良好,但不在 cron 中运行
- 我什么也没看到为什么 crontab 脚本不起作用?这与我息息相关。
非常感谢!
答案1
我只需输入以下内容根的定时任务:
# m h dom mon dow command
40 4 * * * /usr/bin/verify-miab-backup.sh
并将改变脚本的内容如下:
#!/bin/bash
{
echo -e "\n=== $(date) - $0 started - $(id -u -n) ==="
export PASSPHRASE=$(cat /dozer/eandb/miab_22-04/secret_key.txt)
duplicity verify ...
echo -e "\n=== $(date) - $0 finished ==="
} &>> /home/mythbuntu/last_verify_miab_run.log
这边走,全部预期和非预期输出(标准输出) 和错误消息(标准错误) 将附加到日志文件的末尾 ( /home/mythbuntu/last_verify_miab_run.log
),这样您就可以更轻松地调试脚本。您应该将任何其他命令放在花括号 ( {}
) 内,这样您就不会丢失任何内容。
我还将确定duplicity
命令的完整路径(可能/usr/bin/duplicity
),并使用上面第 5 行中的完整路径,以防运行我的进程计划任务脚本没有包含duplicity
其中包含的目录PATH
,并且我在上面的日志中看到相关的错误消息。