পাইথন স্ক্রিপ্টটি নিহত বা মারা গেলে কীভাবে স্বয়ংক্রিয়ভাবে পুনরায় চালু করবেন


31

আমি আমার উবুন্টু মেশিনের (12.04) এর পটভূমিতে আমার পাইথন স্ক্রিপ্টটি চালাচ্ছি -

nohup python testing.py > test.out &

এখন, সম্ভবত এটি হতে পারে যে কোনও পর্যায়ে আমার উপরের যে Python scriptকোনও কারণেই মারা যেতে পারে।

সুতরাং আমি ভাবছিলাম যে cron agentবাশ শেল স্ক্রিপ্টে এমন কোনও প্রকার আছে যা যদি আমার কারণে পাইথন স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে পুনরায় চালু করতে পারে তবে যদি এটি কোনও কারণে মারা যায়।

এটা কি সম্ভব? যদি হ্যাঁ, তবে এই ধরণের সমস্যা সমাধানের সর্বোত্তম উপায় কোনটি?

হালনাগাদ:

testing.confফাইলটি তৈরি করার পরে -

chdir /tekooz
exec python testing.py
respawn

এটি শুরু করার জন্য আমি sudo কমান্ডের নীচে ছুটে এসেছি কিন্তু আমি দেখতে পাচ্ছি না যে এই প্রক্রিয়াটি পিএস কুড়াল ব্যবহার করে পিছনে চলছে?

root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3    S+     0:00 grep --color=auto testing.py

কোনও ধারণা কেন পিএক্স কুড়াল আমাকে কিছু দেখাচ্ছে না? এবং আমি কীভাবে পরীক্ষা করব যে আমার প্রোগ্রামটি চলছে কিনা?

এটি আমার অজগর লিপি -

#!/usr/bin/python
while True:
    print "Hello World"
    time.sleep(5)

উত্তর:


24

উবুন্টুতে (14.04, 16.04 অবধি এবং পরে systemd ব্যবহার করুন) ক্রোন জবের চেয়ে ভাল এটি করতে আপস্টার্ট ব্যবহার করতে পারে। আপনি একটি কনফিগার সেটআপ রেখেছেন /etc/initএবং নিশ্চিত করেছেন যে আপনি রেডন উল্লেখ করেছেন

এটি একটি ন্যূনতম ফাইল হতে পারে /etc/init/testing.conf(হিসাবে সম্পাদনা করুন root):

chdir /your/base/directory
exec python testing.py
respawn

এবং আপনি এটি দিয়ে পরীক্ষা করতে পারেন /your/base/directory/testing.py:

from __future__ import print_function

import time

with open('/var/tmp/testing.log', 'a') as fp:
    print(time.time(), 'done', file=fp)
    time.sleep(3)

এবং দিয়ে শুরু:

sudo start testing

এবং যা ঘটে তা (অন্য উইন্ডোতে) এর সাথে অনুসরণ করুন:

tail -f /var/tmp/testing.log

এবং এর সাথে বন্ধ করুন:

sudo stop testing

আপনি [start on][2]সিস্টেমের বুটে কমান্ড শুরু করতে যোগ করতে পারেন।


আপনি যদি ক্রোন জব ব্যবহার করেন তবে আপনি কার্যকর পিআইডি ফাইল হ্যান্ডলিংয়ের জন্য কোনও কোড প্রয়োগ করতে বা খুঁজে পেতে চাইবেন want আপনি আপনার পরিষেবা / স্ক্রিপ্ট / ডিমন একটি পিআইডি ফাইল তৈরি করতে চান (প্রচলিতভাবে / ভার / রানের অধীনে অবস্থিত) এবং ফাইলটির বিষয়বস্তু সিঁড়িযুক্ত (একটি নিহত প্রক্রিয়া দ্বারা বাম) আছে কিনা তার স্টার্ট-আপ কোড পরীক্ষা করতে হবে। এই ধরণের কোডটি রেস এবং কর্নার কেস মুক্ত লেখার জন্য আশ্চর্যজনকভাবে কঠিন। stackoverflow.com/questions/788411/…
জিম ডেনিস

@ জেলদা: পরামর্শের জন্য ধন্যবাদ .. আমি লিনাক্স / ইউনিক্স ওয়ার্ল্ডে নতুন আছি .. ফাইলটিতে আমার কী ধরণের পরিবর্তন আনার কথা /etc/init? আপনি যদি আমার জন্য ধাপে ধাপে গাইড সরবরাহ করতে পারেন তবে আমি কিছু শিখতে এবং সঠিক জিনিসটি করতে সক্ষম হব ..
অস্ত্রাগার

@ ওয়েবে আমি উত্তরটি আরও সম্পূর্ণ করে দিয়েছি। আপনি যদি আউটপুট জন্য কোনও ফাইল খুলতে না চান এবং আপনার মুদ্রণ বিবৃতিগুলি আবার লিখতে চান sys.stdout = open(file_name, 'w')তবে আপনি শুরুতে এমন কিছু করতে পারেন ।
জেলদা

ধন্যবাদ জেলদা আপনার সহায়তার প্রশংসা করেছেন .. আমি কিছু বিবরণ দিয়ে প্রশ্নটি আপডেট করেছি .. আমার টেস্টিং.পি চলছে কিনা তা দেখার জন্য আমি এটির মতো করার চেষ্টা করছি .. এটি আমাকে দেখায় না যে এটি চলছে কি না .. px ax | grep testing.py.. এটা কি আমাকে ফিরিয়ে দিচ্ছে? কোন ধারণা কেন?
অস্ত্রাগার

আপনার পুরো জিনিসটি চেষ্টা / ক্লজ ব্যতীত রাখা উচিত এবং কোন লগ-ফাইলে লিখতে হবে যে কী ব্যতিক্রম উত্পন্ন হয়েছিল এবং প্রোগ্রামটি সরে গেছে। স্ট্যান্ডআউটে লিখতে না পারায় মুদ্রণ বিবৃতিটি কাজ করে না।
জেলদা

20

আপনি আরও শেল ওরিয়েন্টেড পদ্ধতি গ্রহণ করতে পারেন। আপনার আছে cronযদি এটা ডাইস আপনার স্ক্রিপ্টের জন্য চেহারা এবং এটা পুনরায় লঞ্চ।

  1. চালিয়ে একটি নতুন ক্রন্টব তৈরি করুন crontab -e। এটি আপনার প্রিয় পাঠ্য সম্পাদকের একটি উইন্ডো নিয়ে আসবে।

  2. সবেমাত্র খোলা ফাইলটিতে এই লাইনটি যুক্ত করুন

    */5 * * * * pgrep -f testing.py || nohup python /home/you/scripts/testing.py > test.out
  3. ফাইলটি সংরক্ষণ করুন এবং সম্পাদক থেকে প্রস্থান করুন।

আপনি সবেমাত্র একটি নতুন তৈরি করেছেন crontabযা প্রতি 5 মিনিটে চালানো হবে এবং আপনার স্ক্রিপ্টটি ইতিমধ্যে চালু না হলে চালু করা হবে। একটি সুন্দর ছোট টিউটোরিয়াল জন্য এখানে দেখুন cron। সরকারী উবুন্টু ডক্সে cronহয় এখানে

pgrepকমান্ড লাইনে প্রদত্ত স্ট্রিংয়ের জন্য চলমান প্রক্রিয়াগুলি অনুসন্ধান করে যা প্রকৃত কমান্ড চলছে। pgrep fooনামের একটি প্রোগ্রাম অনুসন্ধান করবে fooএবং এর প্রক্রিয়া শনাক্তকারীকে ফিরিয়ে দেবে । pgrep -fপ্রোগ্রামটি চালু করার জন্য ব্যবহৃত পুরো কমান্ড লাইনটি অনুসন্ধানের জন্য তৈরি করে এবং কেবলমাত্র প্রোগ্রামের নাম নয় (দরকারী কারণ এটি একটি পাইথন স্ক্রিপ্ট)।

||প্রতীক মানে হলো "যদি পূর্ববর্তী কমান্ড ব্যর্থ এই কাজ"। সুতরাং, যদি আপনার স্ক্রিপ্টটি চলমান না থাকে তবে pgrepএটি ব্যর্থ হবে কারণ এটি কিছুই খুঁজে পাবে না এবং আপনার স্ক্রিপ্টটি চালু করা হবে be


আপনাকে ধন্যবাদ .. তবে আমি লিনাক্স এবং ইউনিক্সে নতুন তাই জানি না ক্রন্টব কোথায়? এটি আমার উবুন্টু মেশিনে কোথাও একটি ফাইল?
অস্ত্রাগার

@ ওয়েবে আপডেট হওয়া উত্তর দেখুন।
টেরডন

ধন্যবাদ টেরডন .. আমি crontab -eআমার অজগর স্ক্রিপ্টটি যে ডিরেক্টরিটি দিয়েছি তা থেকে এই আদেশটি চালাতে পারি .. সঠিক?
অস্ত্রাগার

1
@ ওয়েবে আপনি যে কোনও জায়গা থেকে এটি চালাতে পারেন। cronএকটি সময়সূচী ডেমন, এটি ব্যাকগ্রাউন্ডে চলমান একটি পরিষেবা। যদি আপনার অজগর স্ক্রিপ্টটি আপনার না থাকে $PATH(আপনি যদি এটিকে কোথাও থেকে চালু করতে না পারেন তবে এটির ডিরেক্টরিতে থাকা প্রয়োজন) তবে আমার আপডেট হওয়া উত্তরের মতো স্ক্রিপ্টের পুরো পথটি ব্যবহার করুন।
টেরডন

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

6

আপনি টেস্টিং প্রোগ্রামটি কমান্ডলাইন বিকল্পটি ব্যবহার করে আউটপুটটিকে পুনর্নির্দেশ করতে এবং তারপরে প্রোগ্রামটি অনির্দিষ্টকালের জন্য পুনরায় চালু করতে একটি সাধারণ অজগর স্ক্রিপ্ট ব্যবহার করতে পারেন:

import subprocess

while True:
    try:
        print subprocess.check_output(['python', 'testing.py'])
    except KeyboardInterrupt:
        break

আপনি এই প্রোগ্রামটিকে পটভূমিতে রাখতে পারেন এবং একবার আপনি থামাতে চান কেবল এটিকে অগ্রভাগে টানুন এবং এটি হত্যা করুন।


6

আপনার সত্যিকার অর্থে এটি উত্পাদনের জন্য ব্যবহার করা উচিত নয় তবে আপনি এটি করতে পারেন:

#!/bin/sh

while true; do
  nohup python testing.py >> test.out
done &

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


6

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

কিন্তু আপনি তাকান করতে পারেন বিকল্প init এবং জন্য পাইথন কোডে mudur: Pardus বিশেষ করে ডেমন।

যদি আপনি কোনও ক্রোন জব (এবং পিআইডি ফাইল হ্যান্ডলিং) নিয়ে যাওয়ার সিদ্ধান্ত নেন তবে এই পিইপি 3143 পড়ার এবং সম্ভবত এর রেফারেন্স বাস্তবায়নটি বিবেচনা করুন।

আমি আমার অন্যান্য মন্তব্যে ইঙ্গিত হিসাবে, শক্ত পিআইডি ফাইল হ্যান্ডলিং জটিল। এটি রেস এবং কর্নারের ক্ষেত্রে প্রবণ। আপনার পিআইডি ফাইলটি কোনও এনএফএস বা অন্য নেটওয়ার্কযুক্ত ফাইল সিস্টেমে শেষ হওয়ার কোনও সম্ভাবনা নেই (যথাযথ স্থানীয় ইউএনএক্স / লিনাক্স ফাইল সিস্টেমে ফাইল হ্যান্ডলিং সিনটিক্সের সাথে এনটিএসের কিছু সংস্করণ এবং বাস্তবায়ন বন্ধ হয়ে যায় বলে কিছু অ্যাটমিকের গ্যারান্টি রয়েছে) , উদাহরণ স্বরূপ). এছাড়াও ইউএনআইএক্স এর অধীনে ফাইল লক করার আশেপাশে শব্দার্থবিজ্ঞান জটিল হতে পারে। ( উদাহরণস্বরূপ, সিগ্কিল দিয়ে প্রক্রিয়াটি হ'ল যখন আপনার টার্গেট ওএসে কোনও flockবা fcntlলক কী তাৎক্ষণিকভাবে মুক্তি পায়?)।


3

আপনি পিএস-ওয়াচারের সাথে মনিট বা প্রক্রিয়া পর্যবেক্ষণও ব্যবহার করতে পারেন

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

আপনার দৃশ্যের উদাহরণ এখানে:

check process myprocessname
        matching "myprocessname"
        start program = "nohup /usr/bin/python /path/testing.py > /tmp/test.out &"
        stop program = "/usr/bin/killall myprocessname"

Monit উদাহরণ দেখুন


1

আপনার একটি সুপারভাইজার দরকার, আপনি সুপারভাইজার ব্যবহার করতে পারেন । এটি অজগর ভিত্তিক সুপারভাইজার, সুতরাং আপনার প্রয়োজন হলে সংশোধন করা সহজ।

.Ini ফাইল সিনট্যাক্স সহ ফাইলগুলি নিয়ন্ত্রণ করে।


0

টেরডনের উত্তর, আমার পক্ষে কাজ করেনি, কারণ pgrep -f testing.pyকখনও 'ব্যর্থ' হয়নি। এটি ক্রোন কাজের জন্য পিড দখল করবে (কারণ -f বিকল্পের কারণে)। তবে, -f বিকল্পটি ছাড়া pgrep টেস্টিং.পি খুঁজে পাবে না কারণ টেস্টিং.পি নামে কোনও প্রক্রিয়া নেই।

আমার এই সমাধানটি ছিল পরিবর্তন করা

pgrep -f testing.py

থেকে

pgrep -f testing.py | pgrep python

এর অর্থ সম্পূর্ণ ক্রোনট্যাব কাজটি হ'ল:

*/5 * * * * pgrep -f testing.py | pgrep python || nohup python /home/you/scripts/testing.py > test.out

0

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

আমি এটি বাশের উপর পরীক্ষা করেছি। এটি অন্য কোনও শেল ভাল কাজ করা উচিত

#!/bin/sh

echo ""
echo "Use: $0 ./instagram.py"
echo ""

echo "Executing $1 ..."

EXIT_CODE=1
(while [ $EXIT_CODE -gt 0 ]; do
    $1
    # loops on error code: greater-than 0
    EXIT_CODE=$?
done)

0

টার্ডনের উত্তরের জন্য, এখানে দেওয়াpgrep -f testing.py মন্তব্য অনুসারে কখনও মিথ্যা ফিরিয়ে দেওয়া হবে না :

আমি মনে করি যে সমস্যাটি হ'ল ক্রোন আপনার কমান্ডটি চালানোর জন্য একটি শেল তৈরি করে এবং আপনি -f ব্যবহার করার পরে সেই শেলের আর্গুমেন্টগুলি পিগ্রেপের সাথে মিলে যায়

ম্যাট এর উত্তরের জন্য, pgrep -f testing.pyযেহেতু যে pgrep pythonকোনও চলমান পাইথন স্ক্রিপ্টের সাথে মেলে তা অকেজো । সুতরাং দুটি পাইথন স্ক্রিপ্ট ক্রোনজব, দ্বিতীয় ক্রোনজব কখনই চলবে না।

এবং তারপরে আমি pgrep -f testing.pyএখানে মন্তব্যে সমাধানের সমাধানটি পেয়েছি : https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1

দুটি পাইথন স্ক্রিপ্ট চালানোর জন্য আমার ক্রোন:

* * * * * pgrep -f '^/usr/bin/python36 /home/ec2-user/myscript1\.py' || nohup /usr/bin/python36 /home/ec2-user/myscript1.py

0 * * * * pgrep -f '^/usr/bin/python36 /home/ec2-user/myscript2\.py' || nohup /usr/bin/python36 /home/ec2-user/myscript2.py
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.