无法在亚马逊EC2上启用cron任务?

28
我花了两天时间努力理解为什么我无法在我的Ubuntu EC2实例上使cron工作。我已经阅读了文档,但仍需要帮助。我只想得到一个工作的cron任务。
我正在使用一个简单的wget命令来测试cron。我已经验证这可以手动从命令行执行: /usr/bin/wget -O /home/ubuntu/backups/testfile http://www.nytimes.com/ 我的crontab文件看起来像这样: 02 * * * * /usr/bin/wget -O /home/ubuntu/backups/testfile http://www.nytimes.com/ 我在命令之间有单个空格,并且在命令下面有一个空白行。我还试图从系统级别执行此命令:sudo crontab -e,但仍然无法工作。
cron守护程序正在运行:
ps aux | grep crond                                                                                                                   
ubuntu    2526  0.0  0.1   8096   928 pts/4    S+   10:37   0:00 grep crond

计划任务似乎正在运行:

$ crontab -l
02 * * * * /usr/bin/wget -O /home/ubuntu/backups/testfile http://www.nytimes.com/

有人有什么建议或可能的解决方案吗?

谢谢你的时间。


这个有帮助吗:https://dev59.com/1kXRa4cB1Zd3GeqPoADU - Mike Hogan
我建议您先尝试一些简单的操作,以确定问题是出在命令本身还是其他方面。例如,您可以尝试执行以下命令:echo "xxx" >> /var/tmp/myfile.txt,并检查是否成功运行了该命令,方法是查看 /var/tmp/myfile.txt 文件。 - maiklos
能否在cron中使用echo "xxx" > /home/ubuntu/backups/testfile.txt命令创建文件? - maiklos
@maiklos 是的,这也可以。但是,我仍然无法让crontab工作。我已经在这上面工作了好几天了。 - turtle
7个回答

44

在亚马逊Linux服务器上,Cron可以像在任何其他Linux服务器上一样运行。

  1. 使用SSH登录控制台。
  2. 在命令行中运行 crontab -e
  3. 现在您已进入当前用户的crontab的vi编辑器中(默认情况下为控制台用户,具有根权限)
  4. 要测试Cron,请添加以下行:* * * * * /usr/bin/uptime > /tmp/uptime
  5. 现在保存文件并退出vi(按Esc并输入 :wq)。
  6. 一两分钟后,检查/tmp目录中是否创建了uptime文件(cat /tmp/uptime)。
  7. 通过在命令行上键入 uptime 命令,将其与当前系统正常运行时间进行比较。

上述场景在安装有亚马逊Linux操作系统的服务器上成功运行,但它也应该适用于其他Linux盒子。这修改了当前用户的crontab,而不会影响系统的crontab,并且不需要在crontab条目内部使用用户,因为您正在自己的用户下运行事物。更容易,更安全!


3
额外提示:在步骤#6中,也可以执行tail -F /tmp/uptime-F意味着它可以在文件存在之前开始监视)。 - floer32
从技术上讲,-F 与 --follow=name --retry 是相同的。前者选项意味着它可以跟踪具有相同文件名的新文件(如果文件被旋转),而后者意味着它将不断尝试打开一个文件直到找到它(即你所提到的)。 - Torbjørn Kristoffersen

31

你的cron守护进程没有运行。当你运行ps aux | grep crond命令时,结果只显示grep命令正在运行。在运行ps aux | grep blah命令时要注意这一点。

通过运行以下命令检查cron服务的状态。

尝试:

sudo service crond status

更多信息请参见:http://www.cyberciti.biz/faq/howto-linux-unix-start-restart-cron/


4
曾遇到过一个情况,我的 cron 没有工作(守护进程正在运行,因为它在日志中输出了以下信息 - FAILED to authorize user with PAM (Module is unknown))。根据这个答案,使用 /etc/init.d/crond restart 重新启动了守护进程,然后 cron 开始工作了。 - Shashank Agarwal
重新启动crond对我也有用。不确定为什么它一开始停止工作。有人知道在哪里查找吗?Cron日志文件没有显示任何有趣的内容。 - Nick M
1
我也对寻找“FAILED to authorize user with PAM(模块未知)”的实际解决方案感兴趣,而不仅仅是每次重启 cron。我经常遇到这个问题。我只在 logrotate 中使用 cron,因此如果驱动器开始填满,我通常会首先检查 PAM 错误。我希望解决它,使它不再发生。 - jamiegs
应该是带有d的cron吗?:sudo service crond start - David
3
AWS ec2实例将使用sudo service crond status | start | stop | restart命令 - 这也在您提供的文章中已经说明。 - goredwards

17
在某些 AWS Ubuntu EC2 机器上,无法使用“crontab -e”或甚至“sudo crontab -e”(出于某种原因)编辑或运行cron作业。我通过以下方式使cron作业正常工作:
  1. touch /home/ubuntu/crontest.log创建日志文件
  2. sudo vim /etc/crontab编辑系统范围的crontab
  3. 使用root用户在倒数第二行添加自己的cron作业,例如 * * * * * root date && echo 'It works!'>> /home/ubuntu/crontest.log 2>&1,将stdout和stderr转储到您在步骤1中创建的日志文件中
  4. 等待1分钟然后cat /home/ubuntu/crontest.log查看cron作业的输出,以验证它是否正在工作

我已确认此方法可行。在Ubuntu EC2上,编辑/etc/crontab是我唯一能让CRON执行我的作业的方法。感谢@enharmonic。 - Zach
这也解决了 Amazon Linux 机器的问题! - Kathir
对我也有效。谢谢 @enharmonic - zharif
这是我在 Elastic Beanstalk 上找到的唯一可行的方法 - 用 ec2-user 替换 home。 - southafricanrob

3

不要忘记指定要运行的用户。尝试在您的/etc/cron.d文件夹中创建一个以您想要执行的操作命名的新文件,例如getnytimes,并使该文件的内容为:

02 * * * * root /usr/bin/wget -O /home/ubuntu/backups/testfile http://www.nytimes.com/


好的,谢谢。我创建了文件后,如何告诉cron“运行”该文件? - turtle
看起来cron应该自动拾取这个文件一旦它被放置在这里。不幸的是,它仍然无法工作。 - turtle
1
如果您使用“crontab -e”(打开vi编辑器),则用户不是必需的,您可以在其中编辑当前用户的crontab。格式与root cromtab相同,但没有用户。当我在vi编辑器上按下ZZ(或:wq)时,crontab开始运行。用于测试其运行的示例cron行:“* * * * * /usr/bin/uptime > /tmp/uptime”。 - Druvision

2

在我的情况下,cron作业是正常工作的,但是它运行的脚本失败了。失败的原因是因为我在脚本内部的include行中使用了相对路径而不是绝对路径。


2

我找到的解决方法是

  1. 确保crontab处于活动状态:
    sudo service crond status

重新启动crontab,请运行以下命令:
    sudo service crond restart

将cron作业按照通常方式重新调度:
    crontab -e

0

运行中

/usr/bin/wget -O /home/ubuntu/backups/testfile http://www.nytimes.com/

出现了错误

/home/ubuntu/backups/testfile: No such file or directory

这是你的问题吗?我猜cron没有将此错误写入任何地方,你可以将stderr重定向到stdout并像这样查看错误:

02 * * * * /usr/bin/wget -O /home/ubuntu/backups/testfile http://www.nytimes.com/ > /home/ubuntu/error.log 2&>1 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接