एक systemd सेवा फ़ाइल के साथ N प्रक्रियाएँ प्रारंभ करें


36

मुझे एक ssh टनल रखने के लिए ऑटोस शुरू करने के लिए यह सिस्टमड सर्विस फाइल मिली: https://gist.github.com/thomasfr/9707568

[Unit]
Description=Keeps a tunnel to 'remote.example.com' open
After=network.target

[Service]
User=autossh
# -p [PORT]
# -l [user]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
# LOCALPORT:IP_ON_EXAMPLE_COM:PORT_ON_EXAMPLE_COM
ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -p 22 -l autossh remote.example.com -L 7474:127.0.0.1:7474 -i /home/autossh/.ssh/id_rsa

[Install]
WantedBy=multi-user.target

क्या एक सेवा में कई सुरंगों को शुरू करने के लिए सिस्टमड को कॉन्फ़िगर करने का एक तरीका है ।

मैं N सिस्टम सेवा फाइलें नहीं बनाना चाहता, क्योंकि मैं कॉपी + पेस्ट से बचना चाहता हूं।

सभी सर्विस फाइल्स समान होंगी, सिवाय "रिमोट.एक्सप्लिंग.कॉम" के अन्य होस्ट नामों के साथ।

1.5 साल बाद ...

मैंने यह सवाल लगभग 1.5 साल पहले पूछा था।

मेरा मन थोड़ा बदल गया है। हां, यह अच्छा है, कि आप इसे सिस्टमड के साथ कर सकते हैं (मैं अभी भी इसका उपयोग करता हूं), लेकिन मैं भविष्य में कॉन्फ़िगरेशन-प्रबंधन का उपयोग करूंगा।

Systemd को टेम्पलेट भाषा क्यों लागू करनी चाहिए और% h को प्रतिस्थापित करना चाहिए?

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


दूसरे शब्दों में, आप कह रहे हैं कि इस कार्य को पूरा करने के लिए कई समान सेवाओं की फाइल तैयार करने के लिए एक विन्यास प्रबंधन प्रणाली का उपयोग करें? हम्म, शायद। ऐसे अधिकांश मामलों के साथ, इनको अलग करने वाली स्पष्ट विभाजन रेखा नहीं है।
प्रागेट्ज़

@pgoetz कॉन्फिग मैनेजमेंट मेरे लिए अभी भी नया है, लेकिन इसका एक फायदा है यदि आप इस प्रश्न के विषय को देखते हैं: यदि आप कॉन्फिग मैनेज के परिणाम को देखते हैं, जो हर उस व्यक्ति को जानता है जो सिस्टेम सर्विस फाइल को समझेगा: प्लेन और सिंपल सर्विस फाइल्स । मुझे लगता है कि यह एक विन्यास प्रबंधन प्रणाली को सीखने और उपयोग करने के लिए अधिक समझ में आता है क्योंकि ज्ञान का उपयोग सभी विन्यास के लिए किया जा सकता है / आदि, न कि केवल systemd।
गुफ्तगू

जवाबों:


47

ठीक है, यह मानते हुए कि प्रति इकाई फ़ाइल को बदलने वाली एकमात्र चीज remote.example.comहिस्सा है, आप एक त्वरित सेवा का उपयोग कर सकते हैं ।

से systemd.unitआदमी पेज:

वैकल्पिक रूप से, इकाइयों को रनटाइम पर एक टेम्प्लेट फ़ाइल से त्वरित किया जा सकता है। यह एक एकल कॉन्फ़िगरेशन फ़ाइल से कई इकाइयों के निर्माण की अनुमति देता है। यदि सिस्टम यूनिट कॉन्फ़िगरेशन फ़ाइल की तलाश करता है, तो यह पहले फ़ाइल सिस्टम में शाब्दिक इकाई नाम की खोज करेगा। यदि वह कोई सफलता नहीं देता है और इकाई नाम में "@" वर्ण है, तो systemd एक इकाई टेम्पलेट की तलाश करेगा जो समान नाम को साझा करता है लेकिन उदाहरण स्ट्रिंग के साथ (अर्थात "@" वर्ण और प्रत्यय के बीच का भाग) हटा दिया जाता है। उदाहरण: यदि एक सेवा getty@tty3.service का अनुरोध किया जाता है और उस नाम से कोई फ़ाइल नहीं मिलती है, तो सिस्टम गेटी @ @ सेवा को देखेगा और यदि वह पाया जाता है, तो उस कॉन्फ़िगरेशन फ़ाइल से किसी सेवा को तत्काल निकाल सकता है।

मूल रूप से, आप एक एकल इकाई फ़ाइल बनाते हैं, जिसमें एक चर होता है (आमतौर पर %i) जहां अंतर होता है और फिर वे "सेवा" को सक्षम करने पर लिंक से जुड़ जाते हैं।

उदाहरण के लिए, मेरे पास एक इकाई फ़ाइल /etc/systemd/system/autossh@.serviceहै जो इस तरह दिखती है:

[Unit]
Description=AutoSSH service for ServiceABC on %i
After=network.target

[Service]
Environment=AUTOSSH_GATETIME=30 AUTOSSH_LOGFILE=/var/log/autossh/%i.log AUTOSSH_PIDFILE=/var/run/autossh.%i.pid
PIDFile=/var/run/autossh.%i.pid
#Type=forking
ExecStart=/usr/bin/autossh -M 40000 -NR 5000:127.0.0.1:5000 -i /opt/ServiceABC/.ssh/id_rsa_ServiceABC -l ServiceABC %i

[Install]
WantedBy=multi-user.target

जो मैंने तब सक्षम किया है

[user@anotherhost ~]$ sudo systemctl enable autossh@somehost.example.com
ln -s '/etc/systemd/system/autossh@.service' '/etc/systemd/system/multi-user.target.wants/autossh@somehost.example.com.service'

और के साथ हस्तक्षेप कर सकते हैं

[user@anotherhost ~]$ sudo systemctl start autossh@somehost.example.com
[user@anotherhost ~]$ sudo systemctl status autossh@somehost.example.com
autossh@somehost.example.service - AutoSSH service for ServiceABC on somehost.example
   Loaded: loaded (/etc/systemd/system/autossh@.service; enabled)
   Active: active (running) since Tue 2015-10-20 13:19:01 EDT; 17s ago
 Main PID: 32524 (autossh)
   CGroup: /system.slice/system-autossh.slice/autossh@somehost.example.com.service
           ├─32524 /usr/bin/autossh -M 40000 -NR 5000:127.0.0.1:5000 -i /opt/ServiceABC/.ssh/id_rsa_ServiceABC -l ServiceABC somehost.example.com
           └─32525 /usr/bin/ssh -L 40000:127.0.0.1:40000 -R 40000:127.0.0.1:40001 -NR 5000:127.0.0.1:5000 -i /opt/ServiceABC/.ssh/id_rsa_ServiceABC -l ServiceABC somehost.example.com

Oct 20 13:19:01 anotherhost.example.com systemd[1]: Started AutoSSH service for ServiceABC on somehost.example.com.
[user@anotherhost ~]$ sudo systemctl status autossh@somehost.example.com
[user@anotherhost ~]$ sudo systemctl status autossh@somehost.example.com
autossh@somehost.example.com.service - AutoSSH service for ServiceABC on somehost.example.com
   Loaded: loaded (/etc/systemd/system/autossh@.service; enabled)
   Active: inactive (dead) since Tue 2015-10-20 13:24:10 EDT; 2s ago
  Process: 32524 ExecStart=/usr/bin/autossh -M 40000 -NR 5000:127.0.0.1:5000 -i /opt/ServiceABC/.ssh/id_rsa_ServiceABC -l ServiceABC %i (code=exited, status=0/SUCCESS)
 Main PID: 32524 (code=exited, status=0/SUCCESS)

Oct 20 13:19:01 anotherhost.example.com systemd[1]: Started AutoSSH service for ServiceABC on somehost.example.com.
Oct 20 13:24:10 anotherhost.example.com systemd[1]: Stopping AutoSSH service for ServiceABC on somehost.example.com...
Oct 20 13:24:10 anotherhost.example.com systemd[1]: Stopped AutoSSH service for ServiceABC on somehost.example.com.

जैसा कि आप देख सकते हैं, %iयूनिट फ़ाइल के सभी उदाहरणों को प्रतिस्थापित किया जाता है somehost.example.com

वहाँ एक गुच्छा अधिक विनिर्देश है जिसे आप एक यूनिट फ़ाइल में उपयोग कर सकते हैं, लेकिन मुझे %iइस तरह के मामलों में सबसे अच्छा काम करना है।


वाह, सिस्टमड महान है।
गुत्थी

आप यह नहीं दिखाते हैं कि बूट पर स्वचालित रूप से कैसे शुरू किया जाए, जिसमें से कौन शुरू करना है।
क्रेग हिक्स

Systemd के साथ, enableक्रिया वह है जो बूट पर एक यूनिट / सेवा शुरू करती है।
ग्रेग जूल

क्या मैं स्वतंत्र रूप से उदाहरणों को सक्षम / अक्षम कर सकता हूं?
सौम्य कांति

हाँ, यह वही है जो आप कर रहे हैं जब आप उन्हें सक्षम / अक्षम करते हैं।
ग्रेगेल

15

यहां एक अजगर का उदाहरण है, जो कि मैं देख रहा था। @सेवा फ़ाइल नाम में आप एन प्रक्रियाओं शुरू की सुविधा देता है:

$ cat /etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

इसे कॉल करने के विभिन्न तरीके

उदाहरण के लिए विभिन्न गणनाओं को सक्षम करना:

  • 30 श्रमिकों को सक्षम करें:

    sudo systemctl enable my-worker\@{1..30}.service
    
  • 2 कार्यकर्ता सक्षम करें:

    sudo systemctl enable my-worker\@{1..2}.service
    

फिर पुनः लोड करना सुनिश्चित करें:

sudo systemctl daemon-reload

अब आप विभिन्न तरीकों से शुरू / बंद कर सकते हैं:

  • प्रारंभ 1:

    sudo systemctl start my-worker@2.service
    
  • एकाधिक प्रारंभ करें:

    sudo systemctl start my-worker@{1..2}
    
  • एकाधिक रोकें:

    sudo systemctl stop my-worker@{1..2}
    
  • अवस्था जांच:

    sudo systemctl status my-worker@1
    

अद्यतन : उदाहरणों को एक सेवा के रूप में प्रबंधित करने के लिए, आप ऐसा कुछ कर सकते हैं:

/etc/systemd/system/some-worker@.service:

[Unit]
Description=manage worker instances as a service, instance %i
Requires=some-worker.service
Before=some-worker.service
BindsTo=some-worker.service

[Service]
PermissionsStartOnly=true
Type=idle
User=root
#EnvironmentFile=/etc/profile.d/optional_envvars.sh
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
TimeoutStartSec=10
RestartSec=10

[Install]
WantedBy=some-worker.service

/usr/bin/some-worker-start.sh:

#!/bin/bash
systemctl start some-worker@{1..10}

/etc/systemd/system/some-worker.service:

[Unit]
Description=manages some worker instances as a service, instance

[Service]
Type=oneshot
ExecStart=/usr/bin/sh /usr/bin/some-worker-start.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

और अब आप सभी उदाहरणों को प्रबंधित कर सकते हैं sudo systemctl some-worker (start|restart|stop)

यहाँ आपके लिए कुछ बॉयलरप्लेट है script.py:

#!/usr/bin/env python

import logging


def worker_loop():
    shutdown = False
    while True:

        try:
            if shutdown:
                break

            # Your execution logic here.
            # Common logic - i.e. consume from a queue, perform some work, ack message
            print("hello world")

        except (IOError, KeyboardInterrupt):
            shutdown = True
            logging.info("shutdown received - processing will halt when jobs complete")
        except Exception as e:
            logging.exception("unhandled exception on shutdown. {}".format(e))


if __name__ == '__main__':
    worker_loop()

@ ब्रैडेक: दो चीजें जो मुझे समझ में नहीं आती हैं: सबसे पहले,% I का उपयोग केवल यूनिट फ़ाइल के विवरण में किया जाता है। कैसे शुरू करें कमांड को पता है कि क्या शुरू करना है? दूसरा, कैसे systemctl some-worker (start|restart|stop)पता चलता है कि किस पर काम करना है?
यू। विंडल

% i सेवा फ़ाइल के नाम पर @ से आउटपुट है। दूसरा भाग पहले से ही उत्तर में समझाया गया है, देखें Now you can start/stop then in various ways
राडटेक

मुझे लगता है कि लिपियों के शामिल होने के बिना उनका जवाब अधूरा है। अधिकांश "जादू" लिपियों के अंदर किया जाता है जो गायब हैं।
यू। विंडल

मैंने वास्तव में यहां पूर्ण कार्य समाधान प्रदान किया है। आप किस "स्क्रिप्ट" का जिक्र कर रहे हैं? /path/to/my/script.py यदि आप चाहें, तो एक "हैलो दुनिया" हो सकती है। जब तक यह एक किल सिग्नल प्राप्त नहीं करता तब तक कुछ चलता रहेगा। कृपया ध्यान दें कि प्रश्न अजगर के लिए विशिष्ट नहीं है।
राडटेक

वाह यह आपको एक बार में कई गुना शुरू करने देता है? दिमाग उड़ गया ...
rogerdpack

1

ग्रेग के जवाब से मुझे बहुत फायदा हुआ। यहां एक यूनिट टेम्प्लेट का एक उदाहरण है जो मैंने अपने कोड में गियरमैन जॉब सर्वर के लिए ऊपर दिए गए उदाहरण का उपयोग करके किया था। मैंने एक शेल स्क्रिप्ट बनाई जो मुझे इस एक टेम्पलेट का उपयोग करके "श्रमिकों" की एक्स राशि बनाने की अनुमति देती है।

[Unit]
Description=az gearman worker
After=gearman-job-server.service

[Service]
PIDFile=/var/run/gearman_worker_az%i.pid
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite.com/jobs/
ExecStart=/usr/bin/php -f gearman_worker_az.php > /dev/null 2>&1
Restart=on-success
KillMode=process

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