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()

"아무것도 변하지 않는다"라고 말할 때. 오류가 표시됩니까? 실행되지 않습니까? 행동은 무엇입니까?
Raul Marengo

"문서"가 아닌 "Documets"가 의도적입니까?
Raul Marengo

단순히 아무 일도 발생하지 않습니다. :(
guisantogui

이러한 종류는 질문의 범위를 벗어나지 만 "listener.py"스크립트가 수행 할 작업은 무엇입니까? 실행되었음을 나타낼 수있는 작업을 수행합니까? ps -ef | 명령 줄에서 grep 'crond'를 사용하여 cron이 실행 중인지 확인하십시오.
Raul Marengo

아니요,이 스크립트는 여러 cURL의 명령을 다른 컴퓨터로 보냅니다. "ps -f | grep 'crond'"를 실행하면 "souza 4736 3947 0 14:01 pts / 1 00:00:00 grep --color = auto crond"
guisantogui

답변:


131

여기crontab -e 에서 튜토리얼을 사용 하고 따르십시오 .

빈도를 지정하는 방법에 대한 지침은 3 번 지점을 참조하십시오.

요구 사항에 따라 효과적으로 다음과 같아야합니다.

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

1
이 튜토리얼을 따르지만 파일을 저장하면 "/tmp/crontab.JTQ0My/crontab":22 : crontab 파일의 잘못된 분 오류, 설치할 수 없습니다.라는 메시지가 나타납니다. 동일한 편집을 다시 시도 하시겠습니까? (y / n) ""y "를 입력하면 파일 편집으로 돌아 왔습니다."n "을 입력하면 파일이 저장되지 않습니다. 파일의 마지막 줄에 다음 줄을 추가합니다."/ 1 * * * *는 / usr / 빈 / 파이썬 script.py "
guisantogui

@guisantogui 자습서에 "/ 1"사용이 모든 운영 체제에서 지원되지 않을 수 있음을 설명하는 요점이 있습니다. 어떤 운영 체제에서 실행하고 있습니까?
Raul Marengo

3
@guisantogui은 당신이 "/"전에 "*"누락 발견
라울 렝고

또 다른 방법은 script.py에 env 선언을 추가하는 것입니다. 허용 된 솔루션에 대한 내 의견을 참조하십시오. stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl 2014 년

script.py주어진 디렉토리에서만 실행하려면 어떻게해야 합니까?
Shubham A.

67

다음으로 foo.py시작 하는 파일에 스크립트를 넣으십시오.

#!/usr/bin/python

그런 다음 사용하여 해당 스크립트에 실행 권한을 부여하십시오.

chmod a+x foo.py

foo.py파일 의 전체 경로를crontab .

shebang을 처리하는 execve (2) 문서를 참조하십시오 .


1
@Tomer POSIX sh쉘 스크립트라면 그렇습니다. 그들이에 비표준 기능의 특정을 사용하는 경우 ksh, zsh또는 bash그들은 특정 쉘을 사용하여 실행해야합니다.
tripleee

28

당신이 언급했듯이 그것은 아무것도 변경하지 않습니다 .

먼저 아래와 같이 crontab 실행에서 표준 입력표준 오류 를 모두 리디렉션해야 합니다.

*/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

1
@MohideenibnMohammed 리디렉션 오류 메시지 ( stderr가시 명령 라인) ( stdout)
유하 Untinen

이 대답은 상대 경로를 사용하는 경우 사용해야하는 대답입니다.
DaReal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.