为什么 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
.
中查找执行
我已经通过 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
.