აპლიკაციის გაშვება &-ით ან 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 # ჩატვირთვისას გაშვების შეწყვეტა
გულწრფელი გაფრთხილებები
- გაუშვით
daemon-reloadunit ფაილის რედაქტირების შემდეგ, თორემ systemd იყენებს ძველ ვერსიას. - ფრთხილად ავარიის მარყუჟებთან. თუ აპლიკაცია მყისვე ვერ ხერხდება,
Restart=alwaysსამუდამოდ ცდის —RestartSec=5აშორებს მცდელობებს; გამოასწორეთ ძირეული შეცდომა ლოგების მეშვეობით. - უპირატესობა მიანიჭეთ არა-root
User=-ს, რომ კომპრომეტირებული აპლიკაცია მთელ სერვერს არ ფლობდეს.
შემდეგი ნაბიჯები
systemd სერვისი არის ის, როგორ ინახავთ ნებისმიერ რამეს გაშვებულს 24/7 — მაგალითად AI აგენტი, რომელიც მუშაობს დღე და ღამე ან რელე თვითჰოსტინგის RustDesk სერვერის უკან. თუ თქვენი აპლიკაცია სამაგიეროდ კონტეინერიზებულია, Docker-ის --restart unless-stopped ასრულებს იმავე როლს — იხ. როგორ დავაინსტალიროთ Docker.
კომენტარები
ჯერ არ არის კომენტარები. იყავით პირველი.