יש שתי דרכים שבהן בוט "לא עובד" על שרת. הברורה: הוא נעצר ברגע שאתם סוגרים את SSH. הערמומית: הוא רץ בסדר יומיים, קורס ב-4 לפנות בוקר על איזו שגיאה לא-מטופלת, ואתם מגלים שעות אחר כך כשמישהו שואל למה הוא למטה. לשניהם אותו תיקון, וזה לא "לזכור להפעיל אותו מחדש" — זה למסור את העבודה ל-systemd, ששומר דברים למעלה כדי שאתם לא תצטרכו.
למה הוא מת כשאתם מתנתקים
אם הפעלתם אותו עם python bot.py בסשן ה-SSH שלכם, התהליך הוא צאצא של הסשן הזה. סגרו את הסשן, התהליך הולך איתו. nohup ו-& מטייחים את זה, אבל הם לא נותנים לכם restart-בקריסה ולא התחלה-באתחול — אז פתרתם את הבעיה הקטנה ושמרתם את הגדולה.
התיקון האמיתי: שירות systemd
זה כל הדבר. צרו /etc/systemd/system/mybot.service:
[Unit]
Description=My bot
After=network-online.target
[Service]
WorkingDirectory=/home/youruser/mybot
ExecStart=/home/youruser/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
User=youruser
Environment=API_KEY=...
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
שתי שורות עושות את ההרמה הכבדה:
Restart=always— הבוט קורס, systemd מחזיר אותו תוך 5 שניות. אותו מוות של 4 לפנות בוקר הופך להבהוב של 5 שניות שאף אחד לא שם לב אליו.enable— הוא מתחיל שוב אחרי אתחול, בעצמו. ללא "אה, השרת אותחל ושכחתי להפעיל מחדש הכל."
כשהוא עדיין מתנהג לא כשורה — קראו את הלוגים
בוט שממשיך ללולאת-קריסה לא מתוקן על ידי restart חזק יותר; משהו באמת לא בסדר. systemd לוכד stdout/stderr, אז:
systemctl status mybot # up or down, last exit code
journalctl -u mybot -n 100 # recent logs + the error it died on
journalctl -u mybot -f # follow live
הסיבה כמעט תמיד ממש שם: משתנה סביבה חסר, חריגה לא-מטופלת, timeout של API, הריגת OOM. תקנו את זה — Restart=always היא רשת ביטחון, לא תרופה לבאג אמיתי.
טיפ: אם הלוגים מראים את הבוט נהרג בגלל זיכרון, גדלתם מעבר לארגז — בדקו את מדריך המדידה.
מתי tmux או pm2 הגיוניים במקום
systemd אינו התשובה היחידה, רק ברירת המחדל הטובה ביותר:
- tmux — מושלם לבדיקה מהירה או צפייה בתהליך אינטראקטיבי. הריצו, התנתקו, התחברו מחדש אחר כך. אבל הוא לא יפעיל מחדש בקריסה או ישרוד אתחול, אז הוא לא לפרודקשן.
- pm2 — סביר אם אתם כבר בעולם ה-Node ורוצים את לוח הבקרה של התהליכים שלו. הקאץ': pm2 הוא בעצמו תהליך שאתם עכשיו צריכים לשמור חי (בדרך כלל... דרך systemd). לבוט אחד, זו שכבה שאתם לא צריכים.
לבוט תמיד-מקוון בודד או סוכן, systemd הוא הדבר הפשוט ביותר שבאמת עובד — הוא כבר על השרת, לא צריך כלים נוספים, ועושה restart, התחלה-באתחול ו-logging מהקופסה.
השורה התחתונה הכנה
זמן פעילות אינו על שרת גדול יותר או יותר משמעת — הוא על לא לקשור את התהליך שלכם למחשב הנייד שלכם. עטפו אותו ב-unit של systemd עם Restart=always ו-enable, ובדקו את journalctl כשמשהו לא בסדר. עשו את זה פעם אחת והבוט שלכם נשאר למעלה בין אם אתם צופים ובין אם ישנים. (ארגז חדש? נעלו אותו קודם — בוט 24/7 הוא גם מטרה 24/7.)
צריכים איפה להריץ אותו? תוכנית Nano ($3/חודש) שומרת בוט חי 24/7 — systemd עושה את השאר.
תגובות
אין עדיין תגובות. היו הראשונים.