EQVPS

איך ליצור שירות systemd כדי לשמור אפליקציה פועלת

הפכו כל סקריפט או אפליקציה לשירות מנוהל שמתחיל ב-boot, מופעל מחדש אם הוא קורס, ומתעד ל-journalctl. כתבו קובץ unit, הפעילו אותו, ובדקו את הסטטוס — הדרך הסטנדרטית להריץ משהו 24/7 ב-Linux.

הרצת אפליקציה עם & או nohup בסדר עד שהשרת מאותחל, התהליך קורס, או שאתם רוצים למצוא את הלוגים שלו — אז זה מתפרק. systemd הוא התשובה הסטנדרטית: הוא מתחיל את האפליקציה שלכם ב-boot, מפעיל אותה מחדש אם היא מתה, ולוכד את הלוגים שלה. הפיכת סקריפט או בינארי לשירות מנוהל היא קובץ קטן אחד.

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 גורם לו להתחיל ב-boot; --now מתחיל אותו מיד.

4. בדקו סטטוס ולוגים

sudo systemctl status myapp
journalctl -u myapp -f       # follow live logs

פקודות יומיומיות

sudo systemctl restart myapp   # restart after a change
sudo systemctl stop myapp      # stop it
sudo systemctl disable myapp   # stop starting on boot

אזהרות כנות

צעדים הבאים

שירות systemd הוא איך שאתם שומרים כל דבר פועל 24/7 — למשל סוכן AI שרץ מסביב לשעון או הממסר שמאחורי שרת RustDesk בהתארחות עצמית. אם האפליקציה שלכם מכולה במקום זאת, --restart unless-stopped של Docker ממלא את אותו תפקיד — ראו איך להתקין Docker.

שאלות נפוצות

למה להשתמש ב-systemd במקום פשוט להריץ את האפליקציה ברקע?

תהליך שרץ ברקע (עם & או nohup) מת ב-reboot, לא חוזר אם הוא קורס, ומפזר את הלוגים שלו. שירות systemd מתחיל אוטומטית ב-boot, מופעל מחדש בכשל, ושולח את הפלט שלו ל-journalctl. זו הדרך הסטנדרטית והאמינה להריץ משהו ארוך-חיים ב-Linux.

לאן הולכים קובצי unit?

השירותים שלכם הולכים ל-/etc/systemd/system/, קובץ אחד לכל שירות, בשם something.service. אחרי יצירה או עריכה של אחד, הריצו 'systemctl daemon-reload' כדי ש-systemd יקלוט את השינוי, ואז הפעילו והתחילו אותו.

מה עושה 'Restart=always', והאם יש חסרונות?

הוא אומר ל-systemd להפעיל מחדש את השירות בכל פעם שהוא יוצא, מכל סיבה — המפתח לשמירת משהו פועל. המלכוד היחיד הוא לולאת קריסה: אם האפליקציה נכשלת מיד בהתחלה, systemd ממשיך להפעיל אותה מחדש. הוסיפו 'RestartSec=5' כדי לרווח את הניסיונות, ובדקו את הלוגים כדי לתקן את השגיאה הבסיסית.

איך אני רואה את הלוגים של השירות?

השתמשו ב-'journalctl -u yourservice -f' כדי לעקוב אחר פלט חי, או בלי -f כדי לקרוא היסטוריה. systemd לוכד stdout ו-stderr אוטומטית, אז אתם לא צריכים לחווט קובצי לוג בעצמכם.

האם השירות צריך לרוץ כ-root?

עדיף שלא. צרו משתמש ייעודי שאינו root והגדירו 'User=' ב-unit, כך שפריצה של האפליקציה לא תמסור את כל המכונה. הריצו כ-root רק כשהשירות באמת צריך את זה.

תגובות

אין עדיין תגובות. היו הראשונים.

השאירו תגובה

התגובות עוברות מודרציה לפני שהן מופיעות.