尽管尝试了 Stackoverflow 的不同修复,但 crontab 仍无法工作

问题描述 投票:0回答:2

我正在尝试以 root 身份运行一些 cron 作业,但似乎我的 crontab 不起作用。在阅读了这里的很多帖子后,我改变了这些事情:

  • 我已经删除了 crontab 中的 sudo。
  • 我已经在 crontab 中添加了所有命令的完整路径。
  • 每次更改后,我都会重新启动 cron 作业。

但是还没有起作用。

这是我当前的 crontab(我用“sudo crontab -e”从我的 sudo 用户调用它以作为 root 运行它):

0 4 * * * /usr/bin/find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \; > /var/log/log1.log
5 4 * * * /usr/bin/mongodump  --out /var/backups/mongobackups/`date +"%m-%d-%y"` --ssl --sslPEMKeyFile=/etc/ssl/mongo.pem --username <mymongoadminusername> --password <mymongoadminpassword> --authenticationDatabase=admin > /var/log/log2.log
30 4 * * * /opt/letsencrypt/certbot-auto renew > /var/log/log3.log
35 4 * * * /etc/init.d/nginx reload > /var/log/log4.log
40 4 * * * /bin/cat /etc/letsencrypt/archive/<mydomanin>/{fullchain1.pem,privkey1.pem} | /usr/bin/tee /etc/ssl/mongo.pem > /var/log/log5.log

我想用这 5 个命令做的是:

  1. 04:00。删除所有超过 7 天的备份。
  2. 04:04。备份我所有的 mongodb 数据库。
  3. 04:30。尝试更新我的 SSL 证书。
  4. 04:35。重新加载 Nginx 服务。
  5. 04:40。使用新证书更新我的 mongodb.pem 文件。

重要的是,使用 sudo 从 shell 运行的每个命令都可以正常工作。

但是从 cron 来看结果是:

  1. 我不知道这个命令是否有效。日志文件(log1.log)为空。

  2. 它不起作用。尚未创建备份。日志文件(log2.log)尚未创建。

  3. 看来它正在发挥作用。正确运行此命令时,日志文件 (log3.log) 显示标准输出。

  4. 看来它正在发挥作用。正确运行此命令时,日志文件 (log4.log) 显示标准输出。

  5. 好像不行。 mongo.pem 文件具有正确的更新日期,但该文件为空。文件 fullchain1.pem 和 privkey1.pem 具有正确的内容,因此“/usr/bin/tee /etc/ssl/mongo.pem”似乎有问题。日志文件(log5.log)尚未创建。

最后 cron.log 显示了这一点:

Nov 11 04:00:01 myservername CRON[31286]: (root) CMD (/usr/bin/find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \; > /var/log/log1.log)
Nov 11 04:05:01 myservername CRON[31297]: (root) CMD (/usr/bin/mongodump  --out /var/backups/mongobackups/`date +")
Nov 11 04:05:01 myservername CRON[31296]: (CRON) info (No MTA installed, discarding output)
Nov 11 04:07:01 myservername CRON[31306]: (root) CMD (   test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond)
Nov 11 04:17:01 myservername CRON[31325]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Nov 11 04:30:01 myservername CRON[31353]: (root) CMD (/opt/letsencrypt/certbot-auto renew > /var/log/log3.log)
Nov 11 04:30:04 myservername CRON[31352]: (CRON) info (No MTA installed, discarding output)
Nov 11 04:35:01 myservername CRON[31393]: (root) CMD (/etc/init.d/nginx reload > /var/log/log4.log)
Nov 11 04:40:01 myservername CRON[31420]: (root) CMD (/bin/cat /etc/letsencrypt/archive/<mydomanin>/{fullchain1.pem,privkey1.pem} | /usr/bin/tee /etc/ssl/mongo.pem > /var/log/log5.log)
Nov 11 04:40:01 myservername CRON[31419]: (CRON) info (No MTA installed, discarding output)

如果我没记错的话,错误“未安装 MTA,丢弃输出”不是问题,因为它与通过电子邮件发送输出有关,对吗?

那么任何人都可以告诉我我的 crontab 有什么问题吗?

非常感谢!

linux mongodb ssl nginx cron
2个回答
1
投票

我不知道我的 crontab 有什么问题,但如果我将所有这些命令放入一个脚本中并在 crontab 中调用此脚本,这就会起作用。

脚本(myscript.sh):

#!/bin/bash

/usr/bin/find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \; > /var/log/log1.log
/usr/bin/mongodump  --out /var/backups/mongobackups/`date +"%m-%d-%y"` --ssl --sslPEMKeyFile=/etc/ssl/mongo.pem --username <mymongoadminusername> --password <mymongoadminpassword> --authenticationDatabase=admin > /var/log/log2.log
/opt/letsencrypt/certbot-auto renew > /var/log/log3.log
/etc/init.d/nginx reload > /var/log/log4.log
/bin/cat /etc/letsencrypt/archive/<mydomanin>/{fullchain1.pem,privkey1.pem} | /usr/bin/tee /etc/ssl/mongo.pem > /var/log/log5.log

crontab:

00 03 * * * <pathtomyscript>/myscript.sh

现在可以使用了。


0
投票

你想跑步:

/usr/bin/mongodump --out /var/backups/mongobackups/

date +"%m-%d-%y"
--ssl --sslPEMKeyFile=/etc/ssl/mongo.pem --用户名 --password --authenticationDatabase=admin > /var/日志/log2.log

日志文件显示您实际上正在运行:

/usr/bin/mongodump --out /var/backups/mongobackups/`日期+"

这是因为 % 是 crontab 中的保留字符。它代表换行符。你需要像%

一样逃避它

将其作为脚本运行的另一个好处是,您可以通过 shebang 声明决定将哪个 shell 用作解释器。

在我的系统上,crontab 通过破折号(/usr/bin/sh,符号链接到 /usr/bin/dash)而不是 bash(/usr/bin/bash)运行其命令。

© www.soinside.com 2019 - 2024. All rights reserved.