为什么 Ansible 设置的 cronjob 不是 运行?

Why my cronjob setup by Ansible is not running?

我已经通过 Ansible 设置了一个 cron 作业,但是当我使用 crontab -l 时,它说我的 cron 是空的。

这是我的设置脚本。

  - name: Setup cron to run backup.sh every midnight
    cron: 
      name="Backup S3 to GS" 
      minute="0"
      hour="0"
      job="sh ~/backup.sh"
      cron_file=backup_s3
      user=vagrant

但是当我进入 vagrant 机器并使用 ls /etc/cron.d/ 时,我可以看到 backup_s3 文件在那里。但是当我使用命令 crontab -l 时,它说它是空的。

这是backup_s3

的内容
#Ansible: Backup S3 to GS
0 0 * * * vagrant sh ~/backup.sh

我知道这不是 运行ning,因为我没有收到任何电子邮件说备份已完成,当我手动 运行 脚本时它工作正常。

好的。这里有几层混乱。

首先,您在编辑 (crontab -e) 或查看 (crontab -l) 时看到的 crontab 是一个 user cron。它位于一个神奇的线轴 directory/file 中。你不能直接编辑它(大致来说),而且它不是放置任何严肃的 crons 的好地方。

由于您使用的是 cron_file=,Ansible 通过在 /etc/cron.d/ 中放置一个条目来做适当的事情。这意味着可以将单个文件放在那里,这比尝试编辑文档要理智得多。 (look at all the people struggling with lineinfile here on Whosebug)

这就是它没有出现在 crontab -l 中的原因,这是一件好事。

就 cron 的输出而言,电子邮件是否适用于您的 Vagrant 系统?它可能不会。有很多好的方法可以解决这个问题。首先,看/var/log/cron。如果您没有,请在 /var/log/syslog 中查找 CRON 条目。他们可能会指出是否存在问题。

接下来,cron 通常无法很好地访问用户 shell。这意味着你应该避免 ~。此外,如果您对 backup.sh 的权限有误,它可能无法执行。最后,您可以通过管道输出以便您可以看到它。以下是我建议您对 cron 条目执行的操作:

job="/bin/sh /home/vagrant/backup.sh >> /home/vagrant/backup.log"

您还可以修改 minute/hour,使其 运行 更频繁 - 这样您就不必等一整夜才能看到发生了什么。

完成后,您就有很多地方可以查找信息。 /var/log里面有两个地方,有一个新的backup.log会给你信息(如果存在,cron已经运行;如果里面有数据,你应该可以找出任何问题)。

TLDR

更改 job 行。在 /var/log/home/vagrant/backup.log.

中查找执行