【问题标题】:Crontab doesn't work - EC2 - Amazon Web Service (aws) - UbuntuCrontab 不起作用 - EC2 - Amazon Web Service (aws) - Ubuntu
【发布时间】:2016-11-11 04:41:26
【问题描述】:

我不知道为什么,但我的 crontab 无法在 Ubunut 14.0.x - Amazon Web Services (AWS) EC2 中运行。

我已经尝试了很多东西。

例如

sudo nano test.cron

--> * * * * * sudo /usr/bin/python3 /home/ubuntu/Dropbox/MeteoData/test.py

我也试过

--> * * * * * /usr/bin/python3 /home/ubuntu/Dropbox/MeteoData/test.py

然后

chrontab test.cron

crontab -l 

会给我下一个结果:

MAILTO=myemail@hotmail.com
* * * * * sudo /usr/bin/python3 /home/ubuntu/Dropbox/MeteoData/test.py

MAILTO=myemail@hotmail.com
* * * * * /usr/bin/python3 /home/ubuntu/Dropbox/MeteoData/test.py

但是 crontab 什么也没做 :(

尽管如此,如果我正常执行脚本,python 脚本可以完美运行...

import sys, urllib
from selenium.webdriver.common.proxy import *
from bs4 import BeautifulSoup
import csv
import re, os
import urllib.parse
from time import localtime, gmtime, strftime, mktime, sleep

from geopy.geocoders import Nominatim
import csv
from geopy.geocoders.googlev3 import GoogleV3
from _ast import Try
import datetime

def main(args):

    keys = ['Name', 'Latitude','Longitude','Altitude','firstDay']     
    f = open("testNUUUUU.csv", 'w')
    try:
        writer = csv.writer(f,delimiter=',', lineterminator='\n')
        writer.writerow( keys )
    finally:
        f.close()


if __name__ == "__main__":

    try:
        main(sys.argv[1:]) # chop off the sys.argv[0] (script name) and pass the rest.
    except KeyboardInterrupt:
        print('\nUser Break.')

另外,我很确定 crontab 服务器正在运行:

sudo service cron restart
cron stop/waiting
cron start/running, process 3210
  • 我也试过了

    crontab -e

没有任何结果 :'(


因此,如果我在终端中执行代码 --> 它可以工作(它将创建文件)

如果我想让crontab执行代码,它不会起作用:'(

换句话说,有人可以帮忙吗?

【问题讨论】:

  • 您是否为该用户授予了 python 的 sudo 权限?您是否尝试在与 cron 相同的用户 ID 下手动运行脚本?尝试以root身份运行它?仅仅因为它在您的用户 ID 下的 shell 中对您工作正常并不意味着它会在另一个用户的 id/shell 下。
  • @MarcB - 一个不起眼的问题,你是怎么做到的
  • 文件:/etc/sudoers
  • 你检查过日志吗?它们可能位于 /var/log/syslog。
  • 将答案发布为答案,以便人们可以找到它。不要将答案编辑到问题中,也不要在标题中添加“已解决”。 (是的,回答你自己的问题并接受你自己的答案是完全可以的。)

标签: amazon-web-services amazon-ec2 scheduled-tasks ubuntu-14.04 crontab


【解决方案1】:

我的首要问题:如果您忘记在 crontab 文件末尾添加换行符。换句话说,crontab 文件应该以空行结束。

下面是这个问题的手册页中的相关部分(man crontab 然后跳到最后):

cron 要求 crontab 中的每个条目都以换行符结尾。 如果 crontab 中的最后一个条目缺少换行符,cron 将认为 crontab(至少部分)损坏并拒绝安装它。

【讨论】:

    【解决方案2】:

    把你的脚本放在一个文件test.py 开头

    #!/usr/bin/python3
    

    然后使用该脚本授予执行权限

    chmod a+x test.py
    

    并在crontab 中使用test.py 文件的完整路径。

    请参阅处理shebangexecve(2) 的文档

    【讨论】:

    • 还是没有结果:s
    • 你知道crontab的执行路径是什么吗? - 我在我的 python 文件中添加了 -os.chdir("/home/ubuntu/Dropbox/MeteoData") -.-" 并且它有效....因此我怀疑,我一直在工作,但我的文件在某个地方。 .... crontab 执行的地方 ....
    • 你检查你的主目录了吗?
    • 现在我做到了:) 我已将 crontab 行更改为:1 * * * * cd /home/ubuntu/Dropbox/MeteoData/ && sudo /usr/bin/python3 /home/ubuntu/ Dropbox/MeteoData/scriptGetMeteoData.py
    【解决方案3】:

    解决方案 : 显然,整个设置从一开始就是正确的。唯一我没有注意到的是,crontab 将在 home/____/ 目录中执行。由于我的原始 python 脚本需要一些其他文件(由于 wrong 目录而他无法找到的文件。),它无法正确执行它 + 使用测试脚本,没想到结果写在home/___/目录下....

    因此...

    解决方案

    清理/删除所有 crontab(我猜是可选的)

    crontab -r
    

    创建一个 crontab 任务文件

    sudo nano myCrontabTask.cron
    

    编辑 crontab 任务文件

    #
    # 1 * * * * <-- crontab task, which will be executed every hour
    # cd /home/ubuntu/Dropbox/MeteoData/ <-- directory where everything should happen
    # sudo /usr/bin/python3 /home/ubuntu/Dropbox/MeteoData/scriptGetMeteoData.py <-- execute the python script
    #
    1 * * * * cd /home/ubuntu/Dropbox/MeteoData/ && sudo /usr/bin/python3 /home/ubuntu/Dropbox/MeteoData/scriptGetMeteoData.py
    

    将 crontab 任务添加到 crontab

    crontab myCrontabTask.cron
    

    检查是否添加了crontabTask

    crontab -l
    

    如果你做的一切都正确,你会看到你的 crontab 任务

    • 通过此解决方案,它将在 用户级别 上执行 - 如果您想在 root 级别 上执行 en crontab-task,您应该使用

      crontab -e

    不创建 .cron 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      相关资源
      最近更新 更多