अजगर के माध्यम से पायथन स्क्रिप्ट निष्पादित करें


90

मैं Linux crontab का उपयोग करके एक अजगर स्क्रिप्ट को निष्पादित करने की कोशिश कर रहा हूं। मैं इस स्क्रिप्ट को हर 10 मिनट में चलाना चाहता हूं।

मुझे बहुत सारे समाधान मिले और उनमें से कोई भी काम नहीं किया। उदाहरण के लिए: anacron को /etc/cron.d पर संपादित करें या उपयोग करें 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()

जब आप कहते हैं "यह कुछ भी नहीं बदलता है"। क्या यह एक त्रुटि दिखाता है, क्या यह नहीं चलता है? व्यवहार क्या है?
राउल मारेंगो

"डॉक्युमेंट्स" "डॉक्युमेंट्स" के बजाय जानबूझकर है?
राउल मारेंगो

बस कुछ भी नहीं होता है। :(
गुईसंतगोई 15

इस तरह का प्रश्न के दायरे से परे जाता है लेकिन, आप अपनी "श्रोता" स्क्रिप्ट की अपेक्षा क्या करते हैं? क्या यह कुछ भी करता है जो यह संकेत दे सकता है कि यह चला है? करो पी-एफ | grep 'crond' आपकी कमांड लाइन में यह जांचने के लिए कि क्या cron चल रहा है।
राउल मारेंगो

नहीं, यह स्क्रिप्ट किसी अन्य कंप्यूटर पर कई CURL की कमांड भेजती है। जब मैं "ps -f | grep 'crond' को अंजाम देता हूं, तो यह इसे वापस करता है:" souza 4736 3947 0 14:01 pts / 1 00:00:00 grep --color = auto crond "
guisgogui

जवाबों:


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

@guisantogui ट्यूटोरियल में एक बिंदु है जो बताता है कि "/ 1" का उपयोग करना सभी ऑपरेटिंग सिस्टम द्वारा समर्थित नहीं हो सकता है। आप इसे किस ऑपरेटिंग सिस्टम पर चला रहे हैं?
राउल मारेंगो

3
@guisantogui ने देखा कि आपको "/" से पहले "*" याद आ रही है
राउल मारेंगो

दूसरा तरीका यह है कि आप अपने स्क्रिप्टफ्रेम में एक एनवी घोषणा को जोड़ सकते हैं। मेरी टिप्पणियों को स्वीकृत समाधान पर देखें: stackoverflow.com/questions/25633737/python-crontab-and-paths
Quetzalcoatl

क्या होगा यदि आप script.pyदी गई निर्देशिका में ही निष्पादित करना चाहते हैं ?
शुभम ए।

65

अपनी स्क्रिप्ट को किसी फ़ाइल से foo.pyशुरू करें

#!/usr/bin/python

फिर उस स्क्रिप्ट का उपयोग करने के लिए निष्पादन की अनुमति दें

chmod a+x foo.py

और अपनी foo.pyफ़ाइल के पूर्ण पथ का उपयोग करेंcrontab

के दस्तावेज़ देखें execve (2) जो निपटने है मामला


1
@ टॉमर यदि वे पोसिक्स shशेल स्क्रिप्ट हैं तो हाँ। अगर वे करने के लिए गैरमानक सुविधाओं विशिष्ट का उपयोग ksh, zshया bashफिर वे उस विशिष्ट खोल का उपयोग कर चलाने की जरूरत है।
ट्रिपल

25

जैसा कि आपने उल्लेख किया है है कि कुछ भी नहीं बदलता है ,

सबसे पहले, आपको नीचे दिए गए क्रॉस्टैब निष्पादन से स्टडिन और स्टेडर दोनों को पुनर्निर्देशित करना चाहिए:

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

ऊपर क्रॉन्स्टब जॉब इन फ़ाइल को डायरेक्टरी में नहीं बनाएगा /home/souza/Documets/Listener, क्योंकि क्रोन जॉब को इस डायरेक्टरी में निष्पादित नहीं किया जाता है, और आप प्रोग्राम में रिलेटिव पाथ का उपयोग करते हैं। तो इन फाइल को डायरेक्टरी में बनाने के लिए /home/souza/Documets/Listener, निम्नलिखित क्रोन जॉब ट्रिक करेगी:

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

कार्य निर्देशिका में बदलें और वहां से स्क्रिप्ट निष्पादित करें, फिर आप जगह में बनाई गई फ़ाइलों को देख सकते हैं।


2> और 1 का क्या मतलब है?
मोहिदीन बिन मोहम्मद

1
@MohideenibnMohammed रीडायरेक्ट त्रुटि संदेश ( stderr) दृश्यमान कमांड लाइन के लिए ( stdout)
Juha Untinen

यह उत्तर वह है जिसका आपको उपयोग करना चाहिए यदि आप रिश्तेदार पथ का उपयोग कर रहे हैं।
DaReal
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.