通过 crontab 执行 Python 脚本

我正在尝试使用 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()
373447 次浏览

Just use crontab -e and follow the tutorial here.

Look at point 3 for a guide on how to specify the frequency.

Based on your requirement, it should effectively be:

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

Put your script in a file foo.py starting with

#!/usr/bin/python

Then give execute permission to that script using

chmod a+x foo.py

and use the full path of your foo.py file in your crontab.

See documentation of execve(2) which is handling the shebang.

As you have mentioned it doesn't change anything.

First, you should redirect both standard input and standard error from the crontab execution like below:

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

Then you can view the file /tmp/listener.log to see if the script executed as you expected.

Second, I guess what you mean by change anything is by watching the files created by your program:

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

The crontab job above won't create these file in directory /home/souza/Documets/Listener, as the cron job is not executed in this directory, and you use relative path in the program. So to create this file in directory /home/souza/Documets/Listener, the following cron job will do the trick:

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

Change to the working directory and execute the script from there, and then you can view the files created in place.