ক্রোন্তাবের মাধ্যমে পাইথন স্ক্রিপ্ট কার্যকর করুন


90

আমি লিনাক্স ক্রন্টব ব্যবহার করে একটি অজগর স্ক্রিপ্ট কার্যকর করার চেষ্টা করছি। আমি এই স্ক্রিপ্টটি প্রতি 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()

যখন আপনি "এটি কোনও পরিবর্তন করে না" বলবেন। এটি একটি ত্রুটি দেখায়, এটি চালায় না? আচরণ কী?
রাউল মেরেঙ্গো

"ডকুমেন্টস" এর পরিবর্তে "ডকুমেন্টস" ইচ্ছাকৃত?
রাউল মেরেঙ্গো

কেবল কিছুই ঘটে না। :(
গিজান্টোগুই

এই ধরণের প্রশ্নের ক্ষেত্র অতিক্রম করে কিন্তু, আপনি আপনার "শ্রোতার.পি" স্ক্রিপ্টটি কী করবেন বলে আশা করেন? এটি কি এমন কিছু করে যা ইঙ্গিত করে যে এটি চলেছে? পিএস-শেফ করুন | ক্রোন চলছে কিনা তা পরীক্ষা করতে আপনার কমান্ড লাইনে 'crond' লিখুন।
রাউল মেরেঙ্গো

না, এই স্ক্রিপ্টটি বেশ কয়েকটি সিআরএল-এর কমান্ড অন্য কম্পিউটারে প্রেরণ করে। আমি যখন "পিএস-ফ | গ্রেপ 'ক্রন্ড'" চালিত করি, এটি এটিকে ফেরত দেয়: "souza 4736 3947 0 14:01 pts / 1 00:00:00 গ্রেপ --color = স্বয়ংক্রিয় ক্রন্ড"
গুইসন্তোগুই

উত্তর:


131

এখানেcrontab -e টিউটোরিয়ালটি কেবল ব্যবহার করুন এবং অনুসরণ করুন।

কীভাবে ফ্রিকোয়েন্সি নির্দিষ্ট করতে হবে তার গাইডের জন্য 3 পয়েন্টে দেখুন।

আপনার প্রয়োজনের ভিত্তিতে, এটি কার্যকরভাবে হওয়া উচিত:

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

4
আমি এই টিউটোরিয়ালটি অনুসরণ করি, তবে আমি ফাইলটি সংরক্ষণ করার সময় একটি বার্তা উপস্থিত হয়: "/tmp/crontab.JTQ0My/crontab":22: ক্রন্টব ফাইলটিতে খারাপ মিনিটের ত্রুটি, ইনস্টল করতে পারছে না। আপনি কি একই সম্পাদনাটি আবার চেষ্টা করতে চান? (y / n) "যদি আমি" y "টাইপ করি, আমি ফাইল সম্পাদনাতে ফিরে এসেছি এবং আমি যদি" ​​n "টাইপ করি তবে ফাইলটি সংরক্ষণ করা হয় না I আমি ফাইলটির শেষ লাইনে এই লাইনটি যুক্ত করেছি:" / 1 * * * * / usr / বিন / পাইথন স্ক্রিপ্ট.পি "
গুইসানটোগুই

@ গুইস্যান্টোগুই টিউটোরিয়ালে একটি পয়েন্ট রয়েছে যা ব্যাখ্যা করে যে "/ 1" ব্যবহার করা সমস্ত অপারেটিং সিস্টেমের দ্বারা সমর্থনযোগ্য নয়। আপনি কোন অপারেটিং সিস্টেমটিতে এটি চালাচ্ছেন?
রাউল মেরেঙ্গো

4
@ গুইস্যান্টোগুই সবেমাত্র লক্ষ্য করেছেন যে আপনি "/" এর আগে "" "মিস করছেন
রাউল

অন্য উপায়টি হ'ল আপনার স্ক্রিপ্ট.পি-তে একটি এনভির ঘোষণা। গৃহীত সমাধানটির জন্য আমার মন্তব্যগুলি এখানে দেখুন: stackoverflow.com/questions/25633737/python-crontab-and-paths
কোয়েটজলকোটল

আপনি যদি script.pyকেবলমাত্র প্রদত্ত ডিরেক্টরিতে চালিত করতে চান ?
শুভম এ।

66

আপনার স্ক্রিপ্টটি foo.pyশুরু করে কোনও ফাইলে রাখুন

#!/usr/bin/python

তারপরে সেই স্ক্রিপ্টটি ব্যবহার করে নির্বাহের অনুমতি দিন

chmod a+x foo.py

এবং আপনার foo.pyফাইলের পুরো পথ ব্যবহার করুন crontab

এর ডকুমেন্টেশন দেখুন execve (2) যা হ্যান্ডলিং করা হয় কুঁড়েঘর


4
@ টমর যদি তারা পসিক্স 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 এর অর্থ কী?
মহিদিন বিন মোহাম্মদ

4
@ মহিদেবিনম মোহাম্মদ ত্রুটি বার্তাগুলিকে ( stderr) দৃশ্যমান কমান্ড লাইনে ( stdout) পুনঃনির্দেশ করুন
জুহা আনটিনেন

আপনি যদি আপেক্ষিক পথ ব্যবহার করছেন তবে এই উত্তরটি আপনার ব্যবহার করা উচিত।
ডায়ারেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.