هناك طريقتان لا «يعمل» بهما بوت على خادم. الواضحة: يتوقّف اللحظة التي تُغلق فيها SSH. الماكرة: يعمل جيّدًا يومين، يتعطّل الرابعة فجرًا على خطأ غير معالَج، وتكتشف ذلك بعد ساعات حين يسأل أحد لماذا هو معطّل. لكليهما الحلّ نفسه، وهو ليس «تذكّر أن تُعيد تشغيله» — إنه تسليم المهمّة لـ systemd، الذي يُبقي الأشياء مشتغلة كي لا تضطرّ أنت.
لماذا يموت حين تسجّل الخروج
إن أطلقته بـ python bot.py في جلسة SSH، فالعملية ابنة تلك الجلسة. أغلق الجلسة، تذهب العملية معها. nohup و& يُرقّعان هذا، لكنهما لا يمنحانك إعادة تشغيل عند العطل ولا بدءًا عند الإقلاع — فحللت المشكلة الصغيرة وأبقيت الكبيرة.
الحلّ الحقيقي: خدمة 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 ثوانٍ. تلك الموتة الرابعة فجرًا تصير ومضة 5 ثوانٍ لا يلاحظها أحد.enable— يبدأ ثانيةً بعد إعادة تشغيل، من تلقاء نفسه. لا «آه، أُعيد تشغيل الخادم ونسيت إعادة إطلاق كل شيء».
حين يظلّ يسيء التصرّف — اقرأ السجلّات
بوت يظلّ في حلقة تعطّل لا يُصلَح بإعادة تشغيل أقوى؛ شيء ما خطأ فعلًا. systemd يلتقط stdout/stderr، فـ:
systemctl status mybot # مشتغل أم معطّل، آخر رمز خروج
journalctl -u mybot -n 100 # السجلّات الأخيرة + الخطأ الذي مات عليه
journalctl -u mybot -f # متابعة حيّة
السبب تقريبًا دائمًا هناك: متغيّر بيئة مفقود، استثناء غير معالَج، انتهاء مهلة API، قتل نفاد ذاكرة. أصلح ذلك — Restart=always شبكة أمان، لا علاج لخطأ حقيقي.
نصيحة: إن أظهرت السجلّات قتل البوت للذاكرة، فقد تجاوزت الصندوق — راجع دليل تحديد الحجم.
متى يكون tmux أو pm2 منطقيًا بدلًا
systemd ليس الجواب الوحيد، فقط الافتراضي الأفضل:
- tmux — مثالي لـ اختبار سريع أو مراقبة عملية تفاعلية. شغّل، افصل، أعد الوصل لاحقًا. لكنه لن يُعيد التشغيل عند العطل أو ينجو من إعادة تشغيل، فهو ليس للإنتاج.
- pm2 — معقول إن كنت أصلًا في عالم Node وتريد لوحة عملياته. المأخذ: pm2 نفسه عملية عليك الآن إبقاؤها حيّة (عادةً... عبر systemd). لبوت واحد، تلك طبقة لا تحتاجها.
لبوت واحد دائم التشغيل أو وكيل، systemd هو أبسط ما يعمل فعلًا — إنه على الخادم أصلًا، لا يحتاج أدوات إضافية، ويقوم بإعادة التشغيل والبدء-عند-الإقلاع والتسجيل جاهزًا.
الخلاصة الصادقة
وقت التشغيل ليس عن خادم أكبر أو انضباط أكثر — إنه عن عدم ربط عمليتك بحاسوبك المحمول. غلّفه في وحدة systemd بـ Restart=always وenable، وافحص journalctl حين يختلّ شيء. افعل ذلك مرة ويبقى بوتك مشتغلًا سواء كنت تراقب أم نائمًا. (صندوق جديد؟ أحكِمه أولًا — بوت على مدار الساعة هو أيضًا هدف على مدار الساعة.)
تحتاج مكانًا لتشغيله؟ خطة Nano (3$ شهريًا) تُبقي بوتًا حيًّا على مدار الساعة — systemd يفعل الباقي.
التعليقات
لا تعليقات بعد. كن الأول.