मैं systemd का उपयोग करके स्टार्टअप पर एक ही कमांड कैसे चला सकता हूं?


113

मैं निम्नलिखित कमांड का उपयोग करके बूट के बाद अपाचे स्पार्क क्लस्टर को स्टार्टअप करना चाहूंगा:

sudo ./path/to/spark/sbin/start-all.sh

जब सिस्टम रिबूट / शटडाउन करने के लिए तैयार होता है तब यह कमांड चलाएं:

sudo ./path/to/spark/sbin/stop-all.sh

मैं कैसे शुरू कर सकता हूं? क्या कोई मूल टेम्पलेट है जिस पर मैं निर्माण कर सकता हूं?

मैंने एक बहुत ही सरल प्रयोग करने की कोशिश की है (फ़ाइल:) /lib/systemd/system/spark.service:

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

जो काम नहीं करता है।


पर एक नज़र है: wiki.ubuntu.com/SystemdForUpstartUser

हाय @WillemK, मैंने पहले ही इस पृष्ठ को देखा था। यह मुद्दा मैंने पाया है कि मैं सिर्फ execसाथ नहीं बदल सकता ExecStart=। इसके अलावा, मैं पहले इस्तेमाल नहीं किया है।
macourtney7

1
आपकी स्क्रिप्ट के पथ से पहले का डॉट बेहद संदिग्ध दिखता है।
एंड्रिया लज्जाज़ारो

@AndreaLazzarotto मुझे लगता है कि ओपी स्क्रिप्ट को चलाने की कोशिश कर रहा है जिस तरह से ओपी टर्मिनल में होगा इसलिए ....
जॉर्ज उडोसन

हाय @AndreaLazzarotto, यह सही है। किसी भी भ्रम के कारण माफी।
मैकोर्टनी 7

जवाबों:


142

आपकी .serviceफ़ाइल इस तरह दिखनी चाहिए:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

अब .serviceफ़ाइल को सक्षम और उपयोग करने के लिए कुछ और चरण करें :

  1. इसे /lib/systemd/systemएक नाम के साथ फ़ोल्डर में रखेंmyfirst.service

  2. अपनी स्क्रिप्ट को निष्पादन योग्य बनाएं:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. शुरू करें:

    sudo systemctl start myfirst
    
  4. इसे बूट पर चलाने के लिए सक्षम करें:

    sudo systemctl enable myfirst
    
  5. इसे रोक:

    sudo systemctl stop myfirst
    

टिप्पणियाँ:

  1. आपको अपनी सेवा में स्पार्क को सूडो के साथ लॉन्च करने की आवश्यकता नहीं है, क्योंकि डिफ़ॉल्ट सेवा उपयोगकर्ता पहले से ही रूट है।

  2. अधिक systemdविकल्पों के लिए नीचे दिए गए लिंक को देखें ।

अपडेट करें

अब हमारे पास जो कुछ है वह सिर्फ अल्पविकसित है, यहाँ स्पार्क के लिए एक पूर्ण सेटअप है:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

सेवा को सेटअप करने के लिए:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

आगे की पढाई

कृपया निम्न लिंक के माध्यम से पढ़ें। स्पार्क एक जटिल सेटअप है, इसलिए आपको यह समझना चाहिए कि यह उबंटू की init सेवा के साथ कैसे एकीकृत होता है।

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html


विख्यात और अद्यतन
जॉर्ज उदेन

1
इसके लिए धन्यवाद, आपने जो सुझाव दिया है, उसके आधार पर मैंने एक फ़ाइल बनाई है। चलने पर sudo systemctl start sparkनिम्नलिखित त्रुटि प्राप्त होती है:Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
macourtney7

का मुख्य भाग systemctl status spark.serviceनिम्नानुसार है: Executable path is not absoluteऔरspark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

समस्याएँ 1 हैं) स्पार्क बाइनरी पथ (हमें सेवा फ़ाइल में क्या होना चाहिए) को बदलना चाहिए, 2) स्पार्क में एक शट डाउन कमांड है जो यह है। 3) क्या आप मेरे द्वारा दिए गए लिंक के माध्यम से गए थे। मैं स्पार्क का उपयोग नहीं करता हूं इसलिए उन्हें आपूर्ति करें
जॉर्ज यूडेन

? आपके उत्तर के लिए @GeorgeUdosen धन्यवाद, मेरे सवाल का कैसे मैं रिबूट करने के बाद एक विशेष आदेश के तहत चिंगारी चला सकते हैं सवाल यहाँ है askubuntu.com/questions/979498/...
Soheil Pourbafrani

2

यह /root/boot.shन्यूनतम सेवा फ़ाइल का उपयोग करके बूट (रूट के रूप में) पर बनाता है और चलाता है :

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

आप इसे मूल टर्मिनल में Ctrl+ कर सकते हैं C

मापदंडों को संशोधित करने के लिए, उदाहरण के लिए किसी भिन्न का उपयोग करने के लिए $bootscript, उस चर को मैन्युअल रूप से सेट करें और कमांड को कॉपी करते समय बस उस रेखा को छोड़ दें।

कमांड चलाने के बाद, आप अपने पसंदीदा संपादक का उपयोग करके बूट स्क्रिप्ट को संपादित कर सकते हैं, और यह अगले बूट पर चलेगा। आप इसे तुरंत उपयोग करके भी चला सकते हैं:

systemctl start $servicename

हर चरण को सूडो के साथ किया जा सकता है, लेकिन यह थोड़ा अधिक जटिल है, और कुछ प्रणालियों में सूडो स्थापित नहीं है, इसलिए कुछ लोगों को उपयोग करने से पहले उदाहरण को संशोधित करना होगा। इसलिए मैंने उदाहरण में सुडो को शामिल नहीं करने का विकल्प चुना।


मैं systemd डॉक्स से थोड़ा भ्रमित हूं, लेकिन ऐसा नहीं होना चाहिए Type=oneshot RemainAfterExit=yesया जब तक कस्टम स्क्रिप्ट चल रही कुछ प्रक्रियाओं को छोड़ नहीं देती है, तब तक सिस्टम को कार्य को निष्क्रिय माना जाएगा।
पीटर लैम्बबर्ग जूल

@PeterLamberg मैंने सिस्टमड डॉक्स पढ़ने की कोशिश की और फिर भी यहाँ हम दोनों हैं;)। मुझे याद है कि वे बहुत स्पष्ट नहीं थे, लेकिन मैंने जो उत्तर पोस्ट किया था, वह कई प्रणालियों पर मेरे लिए काम करता है (मैं इस पृष्ठ को हर अब और फिर जब मुझे फिर से इसकी आवश्यकता होती है)। क्या इसका मतलब यह है कि, क्योंकि इसे 'निष्क्रिय' माना जाता है, प्रत्येक क्रमिक 'स्टार्ट' कॉल स्क्रिप्ट को फिर से चलाएगा? क्योंकि मुझे लगता है कि एक शेल स्क्रिप्ट के लिए अपेक्षित होगा। मुझे यह अजीब लगेगा अगर मुझे कुछ ऐसा करना होगा जो वास्तव में चल रहा हो, इससे पहले कि मैं इसे फिर से शुरू कर सकूं।
ल्यूक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.