यदि यह विफल हो जाता है तो किसी लिनक्स पृष्ठभूमि प्रक्रिया को स्वचालित रूप से कैसे पुनः आरंभ करें?


32

मेरे पास एक प्रक्रिया है जिसे पृष्ठभूमि पर init.d स्क्रिप्ट द्वारा निष्पादित किया जाता है। उदाहरण के लिए:

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

कुछ स्थितियों में, मायप्रोसेस विफल हो सकता है और वापस लौट सकता है। क्या कोई मानक (मानक) है कि कैसे अपनी असफलता का पता लगाएं और स्वचालित रूप से पुनः आरंभ करें?


ज़रूर, लेकिन यह वितरण के आधार पर भिन्न होता है। उन सभी को बहुत अधिक सेवा प्रबंधक प्रदान करते हैं।
डेविड श्वार्ट्ज

कोई मानक वितरण नहीं है, लेकिन बिल्डरोट। इसलिए मुझे इसे मैन्युअल रूप से करना होगा ...
होन्जा

जवाबों:


14

सबसे आसान तरीका इसे / etc / inittab में जोड़ना होगा , जिसे इस तरह की चीज़ों के लिए बनाया गया है:

प्रतिक्रिया अगर प्रक्रिया मौजूद नहीं है, तो प्रक्रिया शुरू करें। इसकी समाप्ति की प्रतीक्षा न करें (/ / inittab फ़ाइल को स्कैन करना जारी रखें)। जब यह मर जाए तो इस प्रक्रिया को फिर से शुरू करें। यदि प्रक्रिया मौजूद है, तो कुछ भी न करें और / etc / inittab फ़ाइल को स्कैन करना जारी रखें।

उदाहरण के लिए, आप ऐसा कर सकते हैं:

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

ध्यान दें, /etc/inittabकाम करता है (या यहां तक ​​कि मौजूद है) यदि और केवल यदि आपके पास एक सिसविनीट-आधारित इनिट सिस्टम है। ऊपर के साथ और systemd के साथ यह नहीं है। आपको या तो बिजीबॉक्स (बहुत प्राइमेटिव शेल स्थापित करना होगा , जिससे सिस्मैम को कार्यों को ठीक किया जा सकता है, लेकिन यह सिसविनीट-संगत इनटीडी को प्रतिस्थापित कर सकता है) या सिसविनीट (यह एक जीवाश्म है)। एक डॉकटर कंटेनर में, केवल पहला दर्दनाक नहीं है।
पीटर ने कहा कि मोनिका

27

बिल्डरोट में तीन संभावित init सिस्टम हैं, इसलिए ऐसा करने के तीन तरीके हैं:

बिजीबॉक्स init

इसके साथ, एक प्रविष्टि जोड़ता है /etc/inittab

::respawn:/bin/myprocess

ध्यान दें कि बिजीबॉक्स initमें एक idiosyncratic /etc/inittabप्रारूप है। दूसरा फ़ील्ड अर्थहीन है, और पहला फ़ील्ड ID नहीं है, बल्कि डिवाइस बेसनेम है।

लिनक्स "सिस्टम V" 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.... क्या दोनों के लिए सबसे अच्छा तरीका है? अर्थात् अलौकिक sysvinit सेवा, लेकिन यह भी 'सेवा' के माध्यम से प्रयोग करने योग्य है?
अश्वारोही

25

लगातार एक ही प्रक्रिया को कॉल करने वाले एक लूप के साथ एक सबशेल बनाने के बारे में क्या?

यदि यह समाप्त होता है, तो लूप का अगला पुनरावृत्ति चलता है और इसे फिर से शुरू करता है।

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

यदि सबस्क्रिप्शन मर जाता है, तो यह खत्म हो गया है। उस मामले में एकमात्र संभावना एक और प्रक्रिया बनाने की होगी (मैं इसे नेक्रोमांसर कहूंगा) जो यह जांचती है कि क्या आपका प्रजातियां जीवित है, इसे शुरू करें यदि यह नहीं है और इस परिगलन को क्रोन के साथ चलाएं, ताकि आप नियमित रूप से जांच कर सकें।

अगला कदम सोच रहा होगा कि क्या हो सकता है अगर क्रोन मर जाता है, लेकिन कुछ बिंदु पर आपको सुरक्षित महसूस करना चाहिए और चिंता करना बंद कर देना चाहिए।


3

आप मोनेट का उपयोग कर सकते हैं । यह वास्तव में उपयोग करने में आसान है और काफी लचीला है। उदाहरण के लिए देखें विफलता पर टॉमकैट प्रक्रिया को पुनरारंभ करने के लिए यह कॉन्फ़िगरेशन।

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

यदि आप एक सुपर उपयोगकर्ता या रूट नहीं हैं, और यदि आपके लिनक्स सिस्टम में डॉकर स्थापित है, तो आप अपनी प्रक्रिया की एक डॉक छवि बना सकते हैं, यदि सिस्टम रिबूट होने पर अपनी प्रक्रिया को पुनः आरंभ करने के लिए डॉकटर का उपयोग करें।

फ़ाइल: docker-compose.yml

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

नए सिस्टम में उन सभी तुच्छ मुद्दों को हल करने वाले systemd का उपयोग किया जाता है

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