একটি সিস্টেমযুক্ত পরিষেবা ফাইল দিয়ে এন প্রক্রিয়াগুলি শুরু করুন


36

এসএসএস টানেল ধরে রাখতে অটোশ শুরু করতে এই সিস্টেমড সার্ভিস ফাইলটি পেয়েছি: 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

এক পরিষেবাতে বেশ কয়েকটি টানেল শুরু করার জন্য সিস্টেমড কনফিগার করার কোনও উপায় আছে কি ?

আমি এন সিস্টেম পরিষেবা ফাইল তৈরি করতে চাই না, যেহেতু আমি অনুলিপি + পেস্ট এড়াতে চাই।

"রিমোট.এক্স্পেল.কম" ব্যতীত সমস্ত পরিষেবা ফাইল অভিন্ন হবে অন্য হোস্টের নামের সাথে প্রতিস্থাপন করা হবে।

1.5 বছর পরে ...

আমি এই প্রশ্নটি প্রায় 1.5 বছর আগে জিজ্ঞাসা করেছি।

আমার মন কিছুটা বদলে গেছে। হ্যাঁ, এটি দুর্দান্ত, আপনি সিস্টেমডের সাহায্যে এটি করতে পারেন (আমি এখনও এটি ব্যবহার করি) তবে ভবিষ্যতে কনফিগারেশন-পরিচালনা ব্যবহার করব।

কেন সিস্টেমে একটি টেম্পলেট ভাষা প্রয়োগ করতে হবে এবং% h এর বিকল্প ব্যবহার করতে হবে?

বেশ কয়েক মাস পরে আমি মনে করি যে এই লুপটি এবং টেম্পলেটগুলি এমন একটি সরঞ্জামের সাথে সমাধান করা উচিত যা কনফিগারেশনটিকে স্বয়ংক্রিয় করে তোলে। আমি এখন উইকিপিডিয়ায় এই তালিকার একটি সরঞ্জাম ব্যবহার করি ।


অন্য কথায়, আপনি বলছেন যে এই কাজটি সম্পাদন করতে একাধিক প্রায় অভিন্ন পরিষেবা ফাইল তৈরি করতে একটি কনফিগারেশন ম্যানেজমেন্ট সিস্টেম ব্যবহার করবেন? Hmmm হয়তো. এই জাতীয় বেশিরভাগ ক্ষেত্রে যেমন এগুলি আলাদা করে স্পষ্ট বিভাজক রেখা নেই।
pgoetz

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

উত্তর:


47

ওয়েল, ধরে নিলাম যে প্রতি ইউনিট ফাইলের পরিবর্তনের জন্য কেবলমাত্র জিনিসটিই সেই remote.example.comঅংশ, আপনি একটি ইনস্ট্যান্টিয়েটেড পরিষেবা ব্যবহার করতে পারেন ।

থেকে systemd.unitমানুষ পৃষ্ঠা:

Allyচ্ছিকভাবে, ইউনিটগুলি রানটাইমের সময় কোনও টেম্পলেট ফাইল থেকে ইনস্ট্যান্ট করা যেতে পারে। এটি একটি একক কনফিগারেশন ফাইল থেকে একাধিক ইউনিট তৈরি করতে দেয়। যদি সিস্টেমড কোনও ইউনিট কনফিগারেশন ফাইলের সন্ধান করে তবে এটি প্রথমে ফাইল সিস্টেমে আক্ষরিক ইউনিটের নাম অনুসন্ধান করবে। যদি এটির কোনও সাফল্য পাওয়া যায় না এবং ইউনিটের নামটিতে একটি "@" অক্ষর রয়েছে, সিস্টেমড ইউনিট টেমপ্লেটটি সন্ধান করবে যা একই নামটি ভাগ করে তবে উদাহরণস্বরূপ স্ট্রিং (অর্থাত্ "@" অক্ষর এবং প্রত্যয়টির মধ্যবর্তী অংশ) মুছে ফেলা হবে। উদাহরণ: যদি কোনও সার্ভিস getty@ত্তি3.service অনুরোধ করা হয় এবং সেই নামে কোনও ফাইল খুঁজে পাওয়া যায় না, সিস্টেমডি getty @। সার্ভিস সন্ধান করবে এবং যদি এটি পাওয়া যায় তবে সেই কনফিগারেশন ফাইল থেকে কোনও পরিষেবা ইনস্ট্যান্ট করবে।

মূলত, আপনি একটি একক ইউনিট ফাইল তৈরি করেন, যার মধ্যে একটি ভেরিয়েবল থাকে (সাধারণত %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এই ক্ষেত্রে সবচেয়ে ভাল কাজ করতে পাই ।


বাহ, সিস্টেমড দুর্দান্ত।
guettli

বুট থেকে কীভাবে স্বয়ংক্রিয়ভাবে শুরু করতে হবে তা সহ আপনি কী দেখবেন না including
ক্রেগ হিক্স

সিস্টেমেডের সাহায্যে 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 আপনি যা চান তা হতে পারে, আপনি যদি চান তবে একটি "হ্যালো ওয়ার্ল্ড"। এমন কিছু যা চলার পথে চলতে থাকবে যতক্ষণ না এটি একটি কিল সংকেত প্রাপ্ত হয়। দয়া করে নোট করুন প্রশ্নটি অজগর সম্পর্কিত নয়।
র‌্যাডটেক

বাহ এটি আপনাকে একবারে বহুগুণ শুরু করতে দেয়? মন
ফুঁকছে

1

গ্রেগএল এর উত্তর আমাকে অনেক সাহায্য করেছে। গিয়ারম্যান জব সার্ভারের জন্য উপরের উদাহরণটি ব্যবহার করে আমি আমার কোডটিতে ব্যবহার করেছি এমন একক টেম্পলেটটির একটি উদাহরণ। আমি একটি শেল স্ক্রিপ্ট তৈরি করেছি যা আমাকে এই টেমপ্লেটটি ব্যবহার করে X পরিমাণ "শ্রমিক" তৈরি করতে দেয়।

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