EQVPS

როგორ შევქმნათ systemd სერვისი აპლიკაციის მუშაობის შესანარჩუნებლად

აქციეთ ნებისმიერი სკრიპტი ან აპლიკაცია მართულ სერვისად, რომელიც ეშვება ჩატვირთვისას, ხელახლა ეშვება თუ ავარიულად გამოირთვება და აწერს ლოგებს journalctl-ში. დაწერეთ unit ფაილი, ჩართეთ იგი და შეამოწმეთ მისი სტატუსი — სტანდარტული გზა Linux-ზე რაიმეს 24/7 გასაშვებად.

აპლიკაციის გაშვება &-ით ან nohup-ით კარგადაა, სანამ სერვერი არ გადაიტვირთება, პროცესი არ ავარიულ­დება ან თქვენ არ მოინდომებთ მისი ლოგების პოვნას — მაშინ ის იშლება. systemd სტანდარტული პასუხია: ის უშვებს თქვენს აპლიკაციას ჩატვირთვისას, ხელახლა უშვებს თუ ის მოკვდება და იჭერს მის ლოგებს. სკრიპტის ან ბინარის მართულ სერვისად ქცევა ერთი პატარა ფაილია.

1. დაწერეთ unit ფაილი

შექმენით /etc/systemd/system/myapp.service:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

მოარგეთ ExecStart, WorkingDirectory და User თქვენს აპლიკაციას. Restart=always არის ის, რაც მას ცოცხლად ინახავს.

2. შექმენით გამოყოფილი მომხმარებელი (რეკომენდებულია)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

არა-root მომხმარებლად გაშვება ზღუდავს ზიანს, თუ აპლიკაცია ოდესმე კომპრომეტირდება.

3. ჩართეთ იგი და გაუშვით

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable აიძულებს მას გაეშვას ჩატვირთვისას; --now მას მყისვე უშვებს.

4. შეამოწმეთ სტატუსი და ლოგები

sudo systemctl status myapp
journalctl -u myapp -f       # ცოცხალი ლოგების თვალყურისდევნება

ყოველდღიური ბრძანებები

sudo systemctl restart myapp   # გადატვირთვა ცვლილების შემდეგ
sudo systemctl stop myapp      # მისი გაჩერება
sudo systemctl disable myapp   # ჩატვირთვისას გაშვების შეწყვეტა

გულწრფელი გაფრთხილებები

შემდეგი ნაბიჯები

systemd სერვისი არის ის, როგორ ინახავთ ნებისმიერ რამეს გაშვებულს 24/7 — მაგალითად AI აგენტი, რომელიც მუშაობს დღე და ღამე ან რელე თვითჰოსტინგის RustDesk სერვერის უკან. თუ თქვენი აპლიკაცია სამაგიეროდ კონტეინერიზებულია, Docker-ის --restart unless-stopped ასრულებს იმავე როლს — იხ. როგორ დავაინსტალიროთ Docker.

ხდკ

რატომ systemd და არა უბრალოდ აპლიკაციის ფონურად გაშვება?

ფონური პროცესი (& ან nohup-ით) კვდება გადატვირთვისას, არ ბრუნდება თუ ავარიულად გამოირთვება და ფანტავს თავის ლოგებს. systemd სერვისი ავტომატურად ეშვება ჩატვირთვისას, ხელახლა ეშვება წარუმატებლობისას და აგზავნის თავის გამონატანს journalctl-ში. ეს არის სტანდარტული, საიმედო გზა Linux-ზე ხანგრძლივი რამის გასაშვებად.

სად თავსდება unit ფაილები?

თქვენი საკუთარი სერვისები თავსდება /etc/systemd/system/-ში, თითო ფაილი თითო სერვისზე, სახელით რაღაც.service. შექმნის ან რედაქტირების შემდეგ გაუშვით 'systemctl daemon-reload', რომ systemd-მ აიღოს ცვლილება, შემდეგ ჩართეთ და გაუშვით.

რას აკეთებს 'Restart=always' და აქვს თუ არა უარყოფითი მხარეები?

ის ეუბნება systemd-ს, გადატვირთოს სერვისი ყოველ ჯერზე, როცა ის გამოვა, ნებისმიერი მიზეზით — გასაღები რაიმეს მუშაობის შესანარჩუნებლად. ერთადერთი ხაფანგი ავარიის მარყუჟია: თუ აპლიკაცია გაშვებისთანავე მყისვე ვერ ხერხდება, systemd განუწყვეტლივ ხელახლა უშვებს. დაამატეთ 'RestartSec=5' მცდელობების დასაშორებლად და შეამოწმეთ ლოგები ძირეული შეცდომის გამოსასწორებლად.

როგორ ვნახო სერვისის ლოგები?

გამოიყენეთ 'journalctl -u yourservice -f' ცოცხალი გამონატანის თვალყურისდევნებისთვის, ან -f-ის გარეშე ისტორიის წასაკითხად. systemd იჭერს stdout-სა და stderr-ს ავტომატურად, ამიტომ ლოგ-ფაილების თავად მიერთება არ გჭირდებათ.

უნდა გაეშვას თუ არა სერვისი root-ით?

სასურველია არა. შექმენით გამოყოფილი არა-root მომხმარებელი და დააყენეთ 'User=' unit-ში, რომ აპლიკაციის კომპრომეტირებამ მთელი მანქანა არ გადასცეს. გაუშვით root-ით მხოლოდ მაშინ, როცა სერვისს ეს ნამდვილად სჭირდება.

კომენტარები

ჯერ არ არის კომენტარები. იყავით პირველი.

დატოვეთ კომენტარი

კომენტარები მოდერირდება გამოჩენამდე.