הרצת אפליקציה עם & או 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
אזהרות כנות
- הריצו
daemon-reloadאחרי עריכת קובץ unit, אחרת systemd משתמש בגרסה הישנה. - היזהרו מלולאות קריסה. אם האפליקציה נכשלת מיד,
Restart=alwaysמנסה שוב לנצח —RestartSec=5מרווח את הניסיונות; תקנו את שגיאת השורש דרך הלוגים. - העדיפו
User=שאינו root כך שאפליקציה שנפרצה לא תהיה הבעלים של כל השרת.
צעדים הבאים
שירות systemd הוא איך שאתם שומרים כל דבר פועל 24/7 — למשל סוכן AI שרץ מסביב לשעון או הממסר שמאחורי שרת RustDesk בהתארחות עצמית. אם האפליקציה שלכם מכולה במקום זאת, --restart unless-stopped של Docker ממלא את אותו תפקיד — ראו איך להתקין Docker.
תגובות
אין עדיין תגובות. היו הראשונים.