जब Ubuntu शुरू होता है, तो स्वचालित रूप से सेवा कैसे शुरू करें?


31

मैं Ubuntu 12.04 का उपयोग कर रहा हूं और एक सेवा शुरू करना चाहता हूं, जब सिस्टम सामान्य रूप से बूट होता है।

'सेवा' के रूप में मुझे कुछ कोड समझ में आते हैं, उदाहरण के लिए cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x जिसे बस चालू होना चाहिए जैसे कि इसे कमांड लाइन पर शुरू किया गया है। सामान्य उपयोगकर्ता के रूप में शुरू की जाने वाली सेवाएं हैं, लेकिन रूट के रूप में भी शुरू की जाने वाली सेवाएं (वास्तव में, उपयोगकर्ता स्तर पर चलने के लिए सेवाओं की आवश्यकता नहीं है)।

जब 'सेवा' बंद हो जाती है, तो मुझे व्यवहार को कॉन्फ़िगर करने की भी आवश्यकता होती है। मैं चाहता हूं कि उन्हें मेरे मामले में, एक ही तर्क के साथ, एक निर्दिष्ट निर्देशिका में पुनः आरंभ किया जाए।

सिस्टम के सामान्य रूप से चालू होने पर अर्थात पावर स्विच को दबाने पर सभी सेवाएं अपने आप शुरू हो जानी चाहिए। किसी अन्य कार्रवाई की आवश्यकता नहीं होनी चाहिए।

इंटरनेट पर कुछ दस्तावेज़ फैले हुए हैं, लेकिन वे सभी मुझे भ्रमित करते हैं। वे के बारे में बात करते हैं init, init.d, rc.d, लेकिन मैं कभी नहीं एक साधारण-से-पालन कदम-दर-कदम अनुदेश आसानी से करने के लिए जैसे नवोदय का उपयोग कर एक सेवा के रूप में देखा था। यदि यह आसान है, तो मैं सराहना करता हूं कि क्या वे कदम यहां दिए गए हैं।

जवाबों:


33

उबंटू शुरू होने पर स्वचालित रूप से शुरू की जाने वाली नौकरी बनाने के लिए, यहां दिए गए उदाहरण का उपयोग करें । लिखित उदाहरण के रूप में, /etc/init/testservice.confसूडो के साथ निम्न फ़ाइल बनाने के लिए मान लीजिए :

# testservice - test service job file

description "my service description"
author "Me <myself@i.com>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

प्रक्रिया उपयोग को मैन्युअल रूप से शुरू या बंद करना

sudo start testservice
sudo stop testservice

जॉब कंट्रोल कमांड देखें ।


मुझे सेवा शुरू करने के लिए "स्टार्ट ऑन माउंटेड" शुरू करने की आवश्यकता थी।
23:09

23

ठीक है, एलेक्स, मुद्दा यह है कि लिनक्स में सभी उपयोगकर्ता प्रक्रियाएं प्रक्रिया से शुरू होती initहैं, जिनकी पीआईडी ​​1 है। उदाहरण के लिए, pstreeअपनी प्रक्रियाओं के पेड़ को देखने के लिए चलाएं , जिसकी जड़ अयोग्य है। initआजकल प्रक्रिया कार्यान्वयन के कई संस्करण हैं। , सबसे उल्लेखनीय हैं

  • sysVinit (शास्त्रीय इनिट, अभी भी कुछ वितरण द्वारा उपयोग किया जाता है, जिसमें पुराने डेबियन भी शामिल हैं)
  • अपस्टार्ट इनिट, पुराने उबंटू और कुछ आरएचईएल (रेड हैट) और पुराने फेडोरा संस्करणों द्वारा उपयोग किया जाता है
  • systemd init, आधुनिक फेडोरा, उबंटू, डेबियन, RHEL, SUSE संस्करणों द्वारा उपयोग किया जाता है

परंपरागत रूप से, यूनिक्स ने init नामक init कार्यान्वयन का उपयोग किया sysVinit, जिसे Unix के https://ru.wikipedia.org/wiki/UNIX_System_V संस्करण के नाम से पुकारा जाता है । यह बहुत प्रभावशाली है और अन्य inits इसके संगत हैं।

मूल रूप से, sysVinit पहले /etc/inittabफाइल को पढ़ता है, निर्णय लेता है, जिसे चलाने के लिए रनवे होता है और /etc/init.d/rcस्क्रिप्ट को तथाकथित init स्क्रिप्ट को निष्पादित करने के लिए कहता है । उदाहरण के लिए, जब यह आमतौर पर एक बहु-उपयोगकर्ता रनलेवल को बूट करता है, जो आमतौर पर उबंटू पर 2 रनलेवल/etc/init.d/rc होता है , स्क्रिप्ट को निष्पादित करना शुरू करता है /etc/rc2.d। फाइलें लिपियों के लिए केवल प्रतीकात्मक लिंक होती हैं, जबकि स्क्रिप्ट स्वयं /etc/init.dनिर्देशिका में संग्रहीत होती हैं । /etc/rc*.dनिर्देशिकाओं में उन सीमलिंक का नामकरण निम्नानुसार है। कहो, हमें निम्नलिखित स्क्रिप्ट मिली हैं /etc/rc2.d:

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

इसका मतलब है, कि रनवेवेल 2 इनिट प्रक्रिया पर स्विच करने से पहले प्रक्रियाओं को मार दिया network-managerजाता है, इसके स्क्रिप्ट नाम से शुरू होता है K- K02network-managerऔर फिर प्रक्रियाएं शुरू होती हैं, जिनके नाम के साथ शुरू होता है S। दो अंकों के बाद Sया K00 से 99 तक की संख्या है, जो आदेश को निर्धारित करता है, प्रक्रियाओं में शुरू कर दिया जाता है। जैसे rsyslogकि पहले शुरू किया गया है apache2, क्योंकि 16 17 से कम है (जो समझ में आता है, क्योंकि आप चाहते हैं कि अपाचे rsyslog की तार्किक क्षमताओं पर भरोसा करें। , इस प्रकार rsyslog को पहले शुरू किया जाना चाहिए)। स्क्रिप्ट कैजुअल शेल स्क्रिप्ट हैं, जिनके द्वारा निष्पादित किया जाता है #!/bin/sh

तो, मूल रूप से sysVinit शैली में स्टार्टअप पर एक कार्यक्रम शुरू करने, अपनी खुद की पटकथा लिखने (यह किसी उदाहरण से कॉपी-पेस्ट, आप में मिल गया है /etc/init.d), के लिए डाल दिया /etc/init.dऔर एक उचित नाम, उदाहरण के लिए के तहत यह करने के लिए एक सिमलिंक बनाने S99mytrojanमें /etc/rc2.d। यहाँ /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html में ठेठ sysVinit स्क्रिप्ट की व्याख्या दी गई है

अब, उबंटू के लोगों ने फैसला किया कि वे init से अतिरिक्त कार्यक्षमता चाहते हैं। वे एक तेज़ बूटिंग ओएस चाहते थे, इसलिए वे चाहते थे कि उनकी स्क्रिप्ट को समानांतर में निष्पादित किया जाए; वे चाहते थे कि मृत प्रक्रियाएं अपने आप फिर से शुरू हो जाएं; वे चाहते थे कि प्रक्रियाएँ एक-दूसरे को घटनाओं के द्वारा स्पष्ट रूप से आह्वान करें (ताकि अपाचे "syslog start" इवेंट द्वारा चलाया जाए, और syslog "फ़ाइल सिस्टम माउंटेड" इवेंट आदि द्वारा चलाया जाता है, इसलिए हमारे पास कुछ संख्याओं के बजाय इवेंट्स 00 हैं -99)। इस प्रकार, वे Upstart बना चुके हैं और यहां बताया गया है कि यह कैसे काम करता है। अपस्टार्ट इनस्क्रिप्ट को /etc/initनिर्देशिका में रखा जाता है (साथ भ्रमित न करें /etc/init.d)। अपस्टार्ट आमतौर पर /etc/init.d/rcभी चलता है, इसलिए यह आपके sysVinit स्क्रिप्ट को सामान्य रूप से निष्पादित करने वाला है। लेकिन अगर आप चाहते हैं कि बाहर निकलने पर आपकी स्क्रिप्ट को रिस्पॉन्स किया जाए - अपस्टार्ट इवेंट आपके लिए हैं।

हालाँकि मैं यह नहीं देख सकता कि मेरी स्क्रिप्ट काम कर रही है, मुझे लगता है, कि आपके उद्देश्य के लिए, आपको निम्नलिखित /etc/init/mytrojan.confस्क्रिप्ट लिखनी चाहिए :

start on runlevel [02]
respawn
exec mytrojan --argument X 

लेकिन अगर आपको कम से कम फाइल सिस्टम और नेटवर्क पर निर्भरता की आवश्यकता है, तो हो सकता है कि यह start on runlevel [02]कुछ इस तरह से बदल दे :

start on (local-filesystems and net-device-up IFACE!=lo)

चेतावनी: मैंने इसकी शुद्धता की जाँच नहीं की, क्योंकि मैं नहीं कर सकता। विशेष रूप से, मैं इस बारे में निश्चित नहीं हूं कि आपके नेटवर्क कनेक्शन के उठने और चलने के बाद स्क्रिप्ट कैसे शुरू करें (मैंने इस संस्करण का उपयोग किया है )। "नेटवर्क अप अपस्टार्ट" के लिए गुग्लिंग का प्रयास करें।


1
लिनक्स में शुरू हुई प्रक्रिया के इतिहास पर यह एक बहुत अच्छा अवलोकन है, लेकिन यह सवाल का जवाब नहीं देता है। मैं अभी भी नहीं जानता कि कैसे एक upstart प्रक्रिया को 'बनाना' है। मैं भी बस इसका उपयोग करना चाहता हूं, यह कैसे काम करता है पर हर छोटे से छोटे को नहीं समझें। मैं सिर्फ एक सरल और आसान काम करने का उदाहरण देना चाहता था, कैसे शुरू करने के लिए एक प्रक्रिया बनाने के लिए और ubuntu के upstart..l के साथ स्वचालित रूप से प्रतिक्रिया दी।
एलेक्स

@ एलेक्स: एक नमूने के साथ अद्यतन। ध्यान दें, कि मेरी स्क्रिप्ट बहुत अच्छी हो सकती है। मैंने इसे alexreisner.com/code/upstart की भावना से किया
बोरिस बुर्कोव

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