通过crontab执行Python脚本


90

我正在尝试使用Linux crontab执行python脚本。我想每10分钟运行一次此脚本。

我找到了很多解决方案,但都无济于事。例如:在/etc/cron.d中编辑anacron或使用crontab -e。我将此行放在文件的末尾,但它没有任何改变。我需要重启任何服务吗?

*/2 * * * * /usr/bin/python /home/souza/Documets/Listener/listener.py

我必须编辑哪个文件来配置它?

提前致谢


这是脚本。

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import json
import os
import pycurl
import sys
import cStringIO

if __name__ == "__main__":

    name_server_standart = "Server created by script %d"
    json_file_standart = "{ \"server\" : {  \"name\" : \"%s\", \"imageRef\" : \"%s\", \"flavorRef\" : \"%s\" } }"

    curl_auth_token = pycurl.Curl()

    gettoken = cStringIO.StringIO()

    curl_auth_token.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1")
    curl_auth_token.setopt(pycurl.POST, 1)
    curl_auth_token.setopt(pycurl.HTTPHEADER, ["X-Auth-User: cpca", 
                          "X-Auth-Key: 438ac2d9-689f-4c50-9d00-c2883cfd38d0"])

    curl_auth_token.setopt(pycurl.HEADERFUNCTION, gettoken.write)
    curl_auth_token.perform()
    chg = gettoken.getvalue()

    auth_token = chg[chg.find("X-Auth-Token: ")+len("X-Auth-Token: ") : chg.find("X-Server-Management-Url:")-1]

    token = "X-Auth-Token: {0}".format(auth_token)
    curl_auth_token.close()

    #----------------------------

    getter = cStringIO.StringIO()
    curl_hab_image = pycurl.Curl()
    curl_hab_image.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/images/7")
    curl_hab_image.setopt(pycurl.HTTPGET, 1) #tirei essa linha e funcionou, nao sei porque
    curl_hab_image.setopt(pycurl.HTTPHEADER, [token])

    curl_hab_image.setopt(pycurl.WRITEFUNCTION, getter.write)
    #curl_list.setopt(pycurl.VERBOSE, 1)
    curl_hab_image.perform()
    curl_hab_image.close()

    getter = cStringIO.StringIO()

    curl_list = pycurl.Curl()
    curl_list.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/servers/detail")
    curl_list.setopt(pycurl.HTTPGET, 1) #tirei essa linha e funcionou, nao sei porque
    curl_list.setopt(pycurl.HTTPHEADER, [token])

    curl_list.setopt(pycurl.WRITEFUNCTION, getter.write)
    #curl_list.setopt(pycurl.VERBOSE, 1)
    curl_list.perform()
    curl_list.close()

    #----------------------------

    resp = getter.getvalue()    

    con = int(resp.count("status"))

    s = json.loads(resp)

    lst = []

    for i in range(con):
        lst.append(s['servers'][i]['status'])

    for j in range(len(lst)):
        actual = lst.pop()
        print actual

        if actual != "ACTIVE" and actual != "BUILD" and actual != "REBOOT" and actual != "RESIZE":

            print "Entra no If"

            f = file('counter', 'r+w')

            num = 0
            for line in f:
                num = line

            content = int(num)+1    

            ins = str(content)

            f.seek(0)
            f.write(ins)
            f.truncate()
            f.close()

            print "Contador"

            json_file = file('json_file_create_server.json','r+w')

            name_server_final = name_server_standart % content
            path_to_image = "http://192.168.100.241:8774/v1.1/nuvemcpca/images/7"
            path_to_flavor = "http://192.168.100.241:8774/v1.1/nuvemcpca/flavors/1"

            new_json_file_content = json_file_standart % (name_server_final, path_to_image, path_to_flavor)

            json_file.seek(0)
            json_file.write(new_json_file_content)
            json_file.truncate()
            json_file.close()

            print "Json File"

            fil = file("json_file_create_server.json")
            siz = os.path.getsize("json_file_create_server.json")

            cont_size = "Content-Length: %d" % siz
            cont_type = "Content-Type: application/json"
            accept = "Accept: application/json"

            c_create_servers = pycurl.Curl()

            logger = cStringIO.StringIO()

            c_create_servers.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/servers")

            c_create_servers.setopt(pycurl.HTTPHEADER, [token, cont_type, accept, cont_size])

            c_create_servers.setopt(pycurl.POST, 1)

            c_create_servers.setopt(pycurl.INFILE, fil)

            c_create_servers.setopt(pycurl.INFILESIZE, siz)

            c_create_servers.setopt(pycurl.WRITEFUNCTION, logger.write)

            print "Teste perform"

            c_create_servers.perform()

            print logger.getvalue()

            c_create_servers.close()

当您说“它不会改变任何东西”时。它显示错误,不运行吗?行为是什么?
劳尔·马伦戈

“文档”而不是“文档”是故意的吗?
劳尔·马伦戈

根本不会发生任何事情。:(
guisantogui 2012年

这种问题超出了问题的范围,但是,您期望“ listener.py”脚本做什么?它做任何可能表明它已经运行的事情吗?做ps -ef | 在命令行中使用grep'crond'检查cron是否正在运行。
劳尔·马伦戈

不,此脚本将几个cURL的命令发送到另一台计算机。当我执行“ ps -f | grep'crond'”时,它返回以下内容:“ souza 4736 3947 0 14:01 pts / 1 00:00:00 grep --color = auto crond”
guisantogui 2012年

Answers:


131

只需使用crontab -e并按照此处的教程操作即可

请参阅第3点,以获取有关如何指定频率的指南。

根据您的要求,它应该有效地是:

*/10 * * * * /usr/bin/python script.py

1
我按照本教程进行操作,但是当我保存文件时出现一条消息:“ / tmp / crontab.JTQ0My / crontab”:22:crontab文件中的不良分钟错误,无法安装。您要重试相同的编辑吗?(y / n)”,如果我键入“ y”,则返回到文件编辑。如果我键入“ n”,则不会保存文件。我在文件的最后一行添加以下行:“ / 1 * * * * / usr / bin / python script.py“
guisantogui 2012年

@guisantogui教程中有一点说明,并非所有操作系统都支持使用“ / 1”。您在什么操作系统上运行它?
劳尔·马伦戈

3
@guisantogui刚注意到您在“ /”之前缺少“ *”
Raul Marengo'1的

另一种方法是在script.py中添加一个env声明。请参阅我对已接受的解决方案的评论: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl

如果您想执行 script.py在给定目录中怎么办?
Shubham A.

65

将您的脚本放入文件foo.py开头

#!/usr/bin/python

然后使用以下命令授予该脚本的执行权限

chmod a+x foo.py

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

请参阅 正在处理shebangexecve(2)的


1
@Tomer如果它们是POSIX shShell脚本,则可以。如果它们使用特定于ksh,的非标准功能zshbash则需要使用该特定Shell运行它们。
Tripleee '18

25

就像你提到的 它没有任何改变

首先,您应该从crontab执行中重定向stdin和stderr,如下所示:

*/2 * * * * /usr/bin/python /home/souza/Documets/Listener/listener.py > /tmp/listener.log 2>&1

然后您可以查看文件 /tmp/listener.log以查看脚本是否按预期执行。

其次,通过观察程序创建的文件来猜测您要更改的内容什么

f = file('counter', 'r+w')
json_file = file('json_file_create_server.json','r+w')

上面的crontab作业不会在目录中创建这些文件/home/souza/Documets/Listener,因为cron作业不在此目录中执行,并且您在程序中使用相对路径。因此,要在directory中创建这些文件/home/souza/Documets/Listener,以下cron作业可以解决问题:

*/2 * * * * cd /home/souza/Documets/Listener && /usr/bin/python listener.py > /tmp/listener.log 2>&1

转到工作目录并从那里执行脚本,然后您可以查看就地创建的文件。


2>&1是什么意思?
Mohideen bin Mohammed '18

1
@MohideenibnMohammed将错误消息(stderr)重定向到可见的命令行(stdout
Juha Untinen

如果使用相对路径,则应使用此答案。
DaReal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.