একটি লিনাক্স ব্যাকগ্রাউন্ড প্রক্রিয়া ব্যর্থ হলে কীভাবে স্বয়ংক্রিয়ভাবে পুনরায় চালু করবেন?


32

আমার একটি প্রক্রিয়া রয়েছে যা ব্যাকগ্রাউন্ডে init.d স্ক্রিপ্ট দ্বারা কার্যকর করা হয়। উদাহরণ:

case "$1" in 
    start)
       /bin/myprocess &
    stop)
       killall myprocess
    restart)
       killall myprocess
       /bin/myprocess &
esac

নির্দিষ্ট পরিস্থিতিতে মাইপ্রোসেস ব্যর্থ হয়ে ফিরে আসতে পারে return এর ব্যর্থতা সনাক্ত এবং স্বয়ংক্রিয়ভাবে পুনরায় চালু করার উপায় আছে কি?


অবশ্যই, তবে এটি বিতরণের ভিত্তিতে পরিবর্তিত হয়। খুব সুন্দর তাদের সব কিছু একরকম সার্ভিস ম্যানেজার সরবরাহ করে।
ডেভিড শোয়ার্জ

কোনও মান বিতরণ নেই, তবে বিল্ড্রুট। সুতরাং আমাকে এটি ম্যানুয়ালি করতে হবে ...
হনজা

উত্তর:


14

সবচেয়ে সহজ উপায় হ'ল এটিকে / etc / inittab এ যুক্ত করা , যা এই ধরণের কাজটি করার জন্য ডিজাইন করা হয়েছে:

রেসপন প্রক্রিয়াটি বিদ্যমান না থাকলে প্রক্রিয়াটি শুরু করুন। এটি সমাপ্তির জন্য অপেক্ষা করবেন না (/ etc / inittab ফাইলটি স্ক্যান করা চালিয়ে যান)। প্রক্রিয়াটি মারা যাওয়ার পরে পুনরায় চালু করুন। যদি প্রক্রিয়াটি বিদ্যমান থাকে তবে কিছুই করবেন না এবং / ইত্যাদি / আরম্ভব ফাইলটি স্ক্যান করা চালিয়ে যান।

উদাহরণস্বরূপ, আপনি এটি করতে পারেন:

# Run my stuff
myprocess:2345:respawn:/bin/myprocess

দ্রষ্টব্য, /etc/inittabকাজগুলি (বা এমনকি বিদ্যমান) যদি কেবলমাত্র আপনার কাছে সিজনভিট ভিত্তিক ডিআইডি সিস্টেম থাকে। আপস্টার্ট এবং সিস্টেমড সহ এটি হয় না। হয় আপনি ইনস্টল করতে হবে , busybox (sysadm কর্ম বেদনাদায়ক পুনরুদ্ধার উপার্জন খুব আদিম শেল, কিন্তু এটা একটা sysvinit সামঞ্জস্যপূর্ণ initd প্রতিস্থাপন করতে পারেন) অথবা sysvinit (এটি একটি জীবাশ্ম যায়)। ডকার পাত্রে, কেবল প্রথমটি বেদনাদায়ক নয়।
পিটার বলেছেন, মনিকা

27

বিল্ড্রোটের তিনটি সম্ভাব্য ডিআই সিস্টেম রয়েছে, সুতরাং এটি করার জন্য তিনটি উপায় রয়েছে:

busybox init

এটির সাথে একটিতে একটি এন্ট্রি যুক্ত হয় /etc/inittab

::respawn:/bin/myprocess

নোট করুন যে ব্যাসিবক্সের initএকটি আইডিসিঙ্ক্র্যাটিক /etc/inittabফর্ম্যাট রয়েছে। দ্বিতীয় ক্ষেত্রটি অর্থহীন এবং প্রথম ক্ষেত্রটি কোনও আইডি নয়, তবে একটি ডিভাইস বেস নাম।

লিনাক্স "সিস্টেম ভি" init

আবার, একটিতে একটি এন্ট্রি যুক্ত করা হয় /etc/inittab

myprocess:2345:respawn:/bin/myprocess

systemd

কেউ এতে একটি ইউনিট ফাইল লিখেন, বলুন /etc/systemd/system/myprocess.service:

[Unit]
Description=My Process

[Service]
ExecStart=/bin/myprocess
Restart=always

[Install]
WantedBy=multi-user.target

এটি দিয়ে বুটআপে অটোস্টার্ট করতে সক্ষম করুন:

systemctl enable myprocess.service

এটি দিয়ে ম্যানুয়ালি শুরু করুন:

systemctl start myprocess.service

আরও পড়া


তবে আপনি যখন এই পন্থাটি ইনটিটাব ব্যবহার করেন তখন আপনার প্রক্রিয়াটি আর 'পরিষেবা' ইন্টারফেসের মাধ্যমে অ্যাক্সেসযোগ্য নয়? অর্থাত্ আপনি service mything startবা service mything stopআর যেতে পারবেন না .... উভয়ের সেরা হওয়ার কোনও উপায় আছে কি? অর্থাত অপ্রকাশনীয় সিস্টেভিট সার্ভিস, তবে এটি 'পরিষেবা' এর মাধ্যমে ব্যবহারযোগ্য কি?
অশ্বত্যাগকারী

25

ক্রমাগত একই প্রক্রিয়া কল করে এমন একটি লুপের সাথে সাবসেল তৈরি সম্পর্কে কী?

এটি শেষ হলে লুপটির পরবর্তী পুনরাবৃত্তিটি আবার শুরু হয়।

(while true; do 
    /bin/myprocess
done) &

যদি সাবসেল মারা যায় তবে এটি শেষ। সেক্ষেত্রে একমাত্র সম্ভাবনা হ'ল অন্য প্রক্রিয়া তৈরি করা (আমি এটিকে নেক্রোম্যান্সার বলব) যা আপনার প্রসেসটি বেঁচে আছে কিনা তা পরীক্ষা করে, এটি না হলে এটি শুরু করুন এবং ক্রোন দিয়ে এই নেক্রোমেন্সার চালনা করুন, যাতে আপনি নিয়মিত এটি পরীক্ষা করতে পারেন।

পরবর্তী পদক্ষেপটি ভাবছে যে ক্রোন মারা গেলে কী ঘটতে পারে তবে কোনও কোনও মুহূর্তে আপনার নিরাপদ বোধ করা এবং উদ্বেগ বন্ধ করা উচিত।


3

আপনি Monit ব্যবহার করতে পারে । এটি ব্যবহার করা সত্যিই সহজ এবং বেশ নমনীয়। উদাহরণস্বরূপ ব্যর্থতার সাথে টমক্যাট প্রক্রিয়া পুনরায় চালু করার জন্য এই কনফিগারেশনটি দেখুন।

check process tomcat with pidfile /var/run/tomcat.pid
   start program = "/etc/init.d/tomcat start"
   stop  program = "/etc/init.d/tomcat stop"
   if failed port 8080 type tcp then restart

এটি ব্যবহারের ক্ষেত্রে অনেকগুলি কনফিগারেশন উদাহরণ রয়েছে


1

আপনি যদি কোনও সুপার ব্যবহারকারী বা রুট না হন এবং আপনার লিনাক্স সিস্টেমে ডকার ইনস্টল করা থাকে তবে সিস্টেমটি পুনরায় বুট করা থাকলে আপনার প্রক্রিয়াটি পুনরায় চালু করতে ডকার ব্যবহার করে আপনি আপনার প্রক্রিয়াটির একটি ডকার চিত্র তৈরি করতে পারেন।

ফাইল: ডকার-কমপোজ.আইএমএল

version: "3"
services:
  lserver:
    image: your_docker_image:latest
    ports:
    - 8080:8080   # just use 8080 as an example
    restart: always  # this is where your process can be guaranteed to restart

আপনার ডকার ধারক শুরু করতে,

docker-compose up -d

আমি যদি সিস্টেমটির সুপার ব্যবহারকারী না হই তবে অটো-পুনঃসূচনা দিয়ে আমার নিজস্ব-প্রক্রিয়াটি পরিচালনা করা সহজ।

ডকার চিত্র কীভাবে তৈরি করবেন তার একটি নমুনার উদাহরণের জন্য, এখানে একটি দ্রুত উদাহরণ রয়েছে:

ফাইল: ডকফাইফাইল

FROM alpine:3.5

RUN apk update && apk upgrade && rm -rf /var/cache/apk/*
WORKDIR /app
COPY my-process-server /app
RUN ln -s /app/my-process-server /usr/local/bin/my-process-server

EXPOSE 8080

CMD ["my-process-server"]

0

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

বেশিরভাগ শাঁসে চালানো উচিত:

#!/bin/sh

echo ""
echo "Use: $0 ./program"
echo ""

#eg="/usr/bin/apt update"

echo "Executing $1 ..."

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

0

আপনি পুনরায় আরম্ভ করতে পারেন

start)
   restarter -c /bin/myprocess &
stop)
   pkill -f myprocess

নতুন সিস্টেমে সিস্টেমেড ব্যবহার করুন যা এই সমস্ত তুচ্ছ সমস্যার সমাধান করে

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