ডিবাগিং: কনসোল আউটপুট এবং আপস্টার্ট স্ক্রিপ্টস


16

পাইথন কোডটিতে ট্রেসব্যাকগুলি খুঁজে পেতে আপনি কীভাবে একটি টার্মিনালে একটি upstart স্ক্রিপ্টের আউটপুট প্রেরণ করবেন? ট্রেস-ব্যাক ছাড়াই এমন কাজ করতে আমাকে চিরকাল ধরে নিচ্ছে যা কেবল এক সেকেন্ড সময় নেয়। ত্রুটিগুলি নিরূপণ করতে আমার বেশ কয়েকটি ফাইল রাইটিং কল করতে হচ্ছে। কোনও ট্রেসব্যাকের সাহায্যে আগে সন্ধান করতে দ্বিতীয়টি কী নিয়েছিল তা বেশ কয়েক মিনিট মিনিটের মধ্যে প্রবেশ করছে। এটি দুর্ভাগ্যজনক। এটি এখন কয়েক সপ্তাহ ধরে চলছে এবং আমি এতে অসুস্থ। কিছু দয়া করে এই বিষয়ে কথা বলতে হবে। আমার মনে হচ্ছে আমি আবার কোনও ডিবাগার ছাড়াই সমাবেশটি ব্যবহার করছি using

উত্তর:


27

আপনি ভুঁইফোড় 1.4 অথবা ঊর্ধ্বতন সংস্করণ, করা ব্যবহার করেন, তাহলে console logstdout- এ আপনার ভুঁইফোড় কাজের মধ্যে এবং সমস্ত আউটপুট / stderr হবে শেষ হবে /var/log/upstart/<job>.log। তারপরে আপনি tail -f /var/log/upstart/<job>.log &আউটপুটটি টার্মিনালে প্রদর্শিত হবে।


পার্টিতে দেরী করা, তবে এই উত্তরটি আমাকে বাঁচিয়ে দিয়েছে :) এছাড়াও মনে হচ্ছে এটি upstart conf ফাইলটিতে কোনও বিশেষ বিন্যাস ছাড়াই আমার পক্ষে কাজ করে। আমার অংশটির জন্য এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
RSSlite

জানেন না আপস্টার্ট পরিচালিত পরিষেবা লগগুলি ছিল /var/log/upstart। সত্যিই দরকারী, ধন্যবাদ।
ফ্রান্সিসকো

2

আপস্টার্ট কুকবুকে ডিবাগিং কৌশলগুলির একটি সম্পূর্ণ বিভাগ রয়েছে । সবচেয়ে সহজ কাজটি আপনি করতে --debugপারবেন আপনার কার্নেল আর্গুমেন্টগুলিতে যুক্ত করা, যা আপস্টার্টের ভার্বোসিটি বাড়িয়ে দেবে এবং সমস্ত কিছু সিসলগে ফেলে দেবে। হ্যাঁ, ডিবাগিং জটিল, এটি একটি সমান্তরাল থ্রি সিস্টেম তৈরি করতে প্রয়োজনীয় নেট জটিলতার প্রতিচ্ছবি। আমি নিশ্চিত যে উন্নতির জন্য জায়গা আছে।


2
কুক বইটি কোনও নতুন আগতকে ডিবাগিং পরিবেশটি সঠিকভাবে ব্যাখ্যা করে না। আমি এর আগে একই ধরণের ব্যাখ্যা দেখেছি। হয় হয় অভাব বা গুরু অনুমান করা। এটি সম্প্রদায়ের সাথে যুক্ত হতে চান এবং কেবল শুরু করতে চান এমন লোকদের জন্য এটি হতাশ। আমি কখনই এমন প্রোগ্রামিংয়ের পরিবেশে প্রবেশ করি না যা কোডের লাইন সরবরাহ করে না যেখানে সমাবেশ ব্যতীত ত্রুটি দেখা দেয় যেখানে আপনি চাকাটি পুনরায় উদ্ভাবন করছেন, যাতে ক্ষমা করা যায়।
বাম্বুন্টু

ঠিক আছে, তাহলে আপনি কি পরামর্শ দেবেন? এটি একটি উন্মুক্ত দলিল। যদি আপনি কোনও ডিবাগিং প্রযুক্তি পেয়ে থাকেন যা এখানে উপস্থাপিত সমস্ত কিছুর উপরে চলে আসে এবং দয়া করে এটি যুক্ত করুন। ওপির সমস্যাগুলি কীভাবে তার অতিরিক্ত রানটাইমটির ভিতরে বুনিয়াদি প্রিন্ট স্থাপন করা হচ্ছে তার মধ্যে কীভাবে বেসিক ইউনিক্স দৃষ্টান্তগুলি পরিচালনা করবেন তা না বুঝার ফলস্বরূপ you're কারণ আপনি অজগর ব্যবহার করছেন বা [এখানে অভিনব রানটাইমের ভাষা সন্নিবেশ করিয়েছেন] এর অর্থ আপনাকে বোঝায় না মৌলিক রানটাইম, ইউনিক্স উপেক্ষা করুন।
পেপেরাকি

2

আমি যখন পাইথন ডেমন লিখি তখন সমস্ত ব্যতিক্রম আমি ধরি এবং তারপরে লগ ফাইলে নিক্ষেপ করি। আমি কেবল ডিবাগের জন্যই ব্যবহার করি না, প্রযোজনায়ও। আমার এএএর একটি ছোট স্ক্রিপ্ট রয়েছে যা আমি প্রতি সকালে চালিত যা লগগুলিতে কিছু বিরক্তিকর সন্ধান করে।

এটি অবশ্যই ডেমন চালিয়ে যেতে সহায়তা করে।

কিছু নমুনা কোড (আমি আকর্ষণীয় অংশগুলি সরিয়ে নেই):

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename=LOG_FILE,
                    filemode='w')
    logging.info("Sincrod inicializado")
    if not DEBUG:
        daemonize()
    while True:
        try:
            actua()
        except:
            logging.error(sys.exc_info())
        if (datetime.datetime.now().hour > NOITE_EMPEZA\
         and datetime.datetime.now().hour < NOITE_REMATA):
            time.sleep(INTERVALO_NOITE)
        else:
            time.sleep(INTERVALO_DIA)

যেখানে অ্যাক্টুয়া () হ'ল আসল ডেমন (এটি খুব লগ করতে লিখেছে)। নোট করুন যে আমার কাছে একটি সেটিংস ফাইলে একটি DEBUG ভেরিয়েবল রয়েছে, এটি সত্য হয়ে গেলে, আমি ডিমনটি কাঁটাচামচ করি না যাতে এটি কনসোলে কার্যকর হয়।

ডেমন

ডেমনগুলি উইন্ডোজ পরিষেবার সমতুল্য ইউনিক্স। এগুলি এমন প্রক্রিয়া যা অন্যান্য প্রক্রিয়া থেকে পৃথক হয়ে পটভূমিতে চলে। এর অর্থ হ'ল তাদের বাবা সাধারণত দীক্ষা করেন এবং তারা কোনও টিটিআই থেকে বিচ্ছিন্ন থাকে। তারা স্বাধীন হওয়ায় তাদের আউটপুট দেওয়ার কোনও পূর্বনির্ধারিত স্থান নেই।

ডেমন তৈরির জন্য প্রচুর পাইথন লাইব্রেরি এবং স্নিপেট রয়েছে, উপরের উদাহরণে আমি আমার নিজের ফাংশনটি ব্যবহার করি যা স্টেইনার নটসেন্স এবং জেফ কুনেস সংস্করণ থেকে কিছু ধারণাগুলি একত্রিত করে। এটি যতটা সম্ভব সহজ, নোট করুন যে আমি দুবার কাঁটাচামচ করি ।

def daemonize():
    """Forks this process creating a daemon and killing the original one"""
    if (not os.fork()):
        # get our own session and fixup std[in,out,err]
        os.setsid()
        sys.stdin.close()
        sys.stdout = NullDevice()
        sys.stderr = NullDevice()
        if (not os.fork()):
            # hang around till adopted by init
            ppid = os.getppid()
            while (ppid != 1):
                time.sleep(0.5)
                ppid = os.getppid()
        else:
            # time for child to die
            os._exit(0)
    else:
        # wait for child to die and then bail
        os.wait()
        sys.exit()

ওহ ঠিক আছে. যেহেতু আপনি ইতিমধ্যে সিসলগে লগইন করছেন, কেবল আপনার ডেমন বার্তাগুলি ফিল্টার করুন এবং এগুলি কনসোলে ফেলে দিন। আমি দেখতে পাচ্ছি না কেন এটি আপস্টার্টের জন্য নির্দিষ্ট? SysV init একই সমস্যা হবে।
পেপেটেরকি

আপনি ঠিক বলেছেন, এটি বেশিরভাগ ক্ষেত্রেই নির্দিষ্ট নয়, আমার বেশিরভাগ সার্ভারগুলি 8.04 চালায়, কোনও আপস্টার্ট নেই। তবে এটি আপস্টার্টের জন্যও বৈধ। ওপি জিজ্ঞাসা করছিল যে কীভাবে পাইপথন স্ক্রিপ্টগুলি আপস্টার্ট দিয়ে ডিবাগ করা যায়, এমন কোনও পদ্ধতির জন্য নয় যা কেবল উপস্টার্ট দিয়ে কাজ করে। আমি সিসলগে লগইন করছি না তবে একটি নির্দিষ্ট ফাইলে লগ করছি, এবং এখানে 'ট্রিক' সমস্ত ব্যতিক্রম ধরা পড়ছে এবং স্ট্যাকের ট্রেসটি সেই ফাইলে ডাম্প করছে।
জাভিয়ের রিভেরা

ঠিক আছে, এটি ঠিক প্রাসঙ্গিক উপর ভিত্তি করে stdout পরিচালনা? আমি প্রচুর ইউনিক্স ডেমন জানি যে এটি টিটিটির সাথে সংযুক্ত বা ডেমন হিসাবে কাজ করছে তা নির্বিশেষে সমান লগিং ভার্বোসিটি রয়েছে। যদি এটি রুবি হয় তবে আমি বেস ক্লাস পদ্ধতিটি আউটপুট ব্যবহার করতে ওভার রাইড বা সজ্জিত করতাম। আমি নিশ্চিত পাইথনেও তেমন কিছু করা যেতে পারে। আপনি স্ট্যাক এক্সচেঞ্জ যথাযথ এই প্রশ্ন জিজ্ঞাসা আরও ভাল পরিবেশিত হতে পারে। এটি বেসিক ইউনিক্স ডেমন কোডিং / ডিজাইনের সমস্যাগুলির আরও বেশি, এবং যেমনটি আপনি বলেছেন যে এটির স্ক্রিপ্টগুলির সাথে সুনির্দিষ্ট কিছু নেই।
পাপেটেরকি

আমি এখনও লিঙ্গোর সাথে পরিচিত হই। আমি ডিমন দ্বারা ধরে নিয়েছি, আপনার অর্থ একটি নির্দিষ্ট স্ক্রিপ্ট যা পটভূমিতে চলে। আপনার কোডে আমি script স্ক্রিপ্ট কলটির জন্য কলব্যাকগুলি পেতে কেবল আমার স্ক্রিপ্টটি অ্যাক্টুয়ার () এর জায়গায় রেখেছি? কোনও ফাইলের পরিবর্তে এটি কনসোলে চ্যানেল করার কী আছে?
বাম্বুন্টু

1
স্ট্যান্ড একাকী অর্থে ডেমনগুলি সাধারণত যে টিটি শুরু হয়েছিল সেগুলি থেকে আলাদা করা হয়, তাদের মূল ফাইল হ্যান্ডলগুলি স্টিডিন, স্টডআউট এবং স্টিডিনে বন্ধ করে দেওয়া হয়েছে এবং তারা ইনস এর সন্তান। সুতরাং আপনি যদি নির্দিষ্ট কোথাও ব্যতিক্রমগুলি মুদ্রণ করতে চান তবে সেগুলি কীভাবে আউটপুট হয়েছে তা সন্ধান করুন এবং সেখান থেকে তাদের পরিচালনা করুন। linfo.org/daemon.html । আবার, এটিকে আপস্টার্ট, বা এমনকি ডিএসটির সাথে আর কিছুই করার নেই। আপনার প্রোগ্রামটি সত্যিকারের ডেমন মোডে সঠিকভাবে কাজ করা পান এবং তারপরে এটি স্টার্টটি সরান।
পাইপেরকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.