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

「何も変わらない」と言うと。エラーが表示されますか、実行されませんか?動作は何ですか?
ラウルマレンゴ2012年

「ドキュメント」ではなく「ドキュメント」は意図的なものですか?
ラウルマレンゴ2012年

単に何も発生しません。:(
guisantogui 2012年

この種の質問の範囲を超えていますが、「listener.py」スクリプトに何を期待しますか?実行されたことを示す可能性のあることはありますか?ps-efを実行します| コマンドラインでgrep'crond 'を実行して、cronが実行されているかどうかを確認します。
ラウルマレンゴ2012年

いいえ、このスクリプトはいくつかの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 / bin / python script.py "
guisantogui 2012年

@guisantoguiチュートリアルには、「/ 1」の使用がすべてのオペレーティングシステムでサポートされているとは限らないことを説明するポイントがあります。これを実行しているオペレーティングシステムは何ですか?
ラウルマレンゴ2012年

3
@guisantoguiは、「/」の前に「*」がないことに気づきました
Raul Marengo

もう1つの方法は、script.pyにenv宣言を追加することです。受け入れられたソリューションへの私のコメントを参照してください: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl

script.py指定されたディレクトリでのみ実行する場合はどうなりますか?
ShubhamA.18年

66

スクリプトをでfoo.py始まるファイルに入れます

#!/usr/bin/python

次に、を使用してそのスクリプトに実行権限を付与します

chmod a+x foo.py

foo.pyファイルのフルパスを使用しますcrontab

シェバンを処理しているexecve(2)のドキュメントを参照してください


1
@Tomer POSIXshシェルスクリプトの場合は、はい。、、またはに固有の非標準機能を使用する場合はksh、その特定のシェルを使用して実行する必要があります。zshbash
トリプリー2018

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ジョブがこのディレクトリで実行されておらず、プログラムで相対パスを使用しているためです。したがって、これらのファイルをディレクトリに作成するに/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 2018

1
@MohideenibnMohammedリダイレクトエラーメッセージ(stderr)を表示されているコマンドライン(stdout
Juha Untinen 2018

この答えは、相対パスを使用している場合に使用する必要があるものです。
daReal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.