Bir botun bir sunucuda "çalışmamasının" iki yolu var. Bariz olanı: SSH'ı kapattığın saniye durur. Sinsi olanı: iki gün sorunsuz çalışır, gece 4'te yakalanmamış bir hatada çöker ve saatler sonra biri neden kapalı olduğunu sorunca öğrenirsin. İkisinin de aynı çözümü var ve o "yeniden başlatmayı unutma" değil — işi systemd'ye devretmek, ki o şeyleri ayakta tutar, sen tutmak zorunda kalmayasın.
Çıkış yapınca neden ölür
Onu SSH oturumunda python bot.py ile başlattıysan, süreç o oturumun bir çocuğudur. Oturumu kapat, süreç de onunla gider. nohup ve & bunun üstünü örter ama sana çökmede yeniden başlatma ve açılışta başlatma vermez — yani küçük sorunu çözüp büyüğünü tuttun.
Gerçek çözüm: bir systemd hizmeti
Her şey bu. /etc/systemd/system/mybot.service oluştur:
[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
Ağır işi yapan iki satır var:
Restart=always— bot çöker, systemd onu 5 saniyede geri getirir. O gece 4'teki ölüm, kimsenin fark etmediği 5 saniyelik bir titreme olur.enable— bir yeniden başlatmadan sonra kendi başına tekrar başlar. "Ah, sunucu yeniden başladı ve her şeyi yeniden başlatmayı unuttum" yok.
Hâlâ hatalı davranıyorsa — logları oku
Çökme döngüsüne giren bir bot daha sert yeniden başlatarak düzelmez; gerçekten bir şey yanlıştır. systemd stdout/stderr'i yakalar, o yüzden:
systemctl status mybot # açık ya da kapalı, son çıkış kodu
journalctl -u mybot -n 100 # son loglar + öldüğü hata
journalctl -u mybot -f # canlı takip
Sebep neredeyse her zaman tam oradadır: eksik bir ortam değişkeni, yakalanmamış bir istisna, bir API zaman aşımı, bir OOM kill. Onu düzelt — Restart=always bir güvenlik ağıdır, gerçek bir hatanın tedavisi değil.
İpucu: loglar botun bellek için öldürüldüğünü gösteriyorsa, kutuyu aşmışsın demektir — boyutlandırma kılavuzuna bak.
tmux ya da pm2 ne zaman mantıklı
systemd tek cevap değil, sadece en iyi varsayılan:
- tmux — bir hızlı test ya da etkileşimli bir süreci izlemek için mükemmel. Çalıştır, ayrıl, sonra tekrar bağlan. Ama çökmede yeniden başlamaz ve bir yeniden başlatmadan sağ çıkmaz, o yüzden üretim için değil.
- pm2 — zaten Node dünyasındaysan ve süreç kontrol panelini istiyorsan makul. Püf noktası: pm2 artık senin ayakta tutman gereken bir sürecin kendisi (genellikle... systemd üzerinden). Tek bir bot için, ihtiyacın olmayan bir katman.
Tek, her zaman açık bir bot ya da ajan için systemd gerçekten işe yarayan en basit şeydir — zaten sunucuda, ek araç gerektirmez ve yeniden başlatmayı, açılışta başlatmayı ve loglamayı kutudan çıkar çıkmaz yapar.
Dürüst sonuç
Çalışma süresi daha büyük bir sunucuyla ya da daha çok disiplinle ilgili değil — sürecini dizüstüne bağlamamakla ilgili. Onu Restart=always ve enable içeren bir systemd birimine sar ve bir şey ters gittiğinde journalctl'yi kontrol et. Bunu bir kez yap ve botun, sen izlesen de uyusan da ayakta kalsın. (Yeni kutu mu? Önce kilitle — 7/24 bir bot aynı zamanda 7/24 bir hedeftir.)
Çalıştıracak bir yere mi ihtiyacın var? Bir Nano planı ($3/ay) bir botu 7/24 ayakta tutar — gerisini systemd yapar.
Yorumlar
Henüz yorum yok. İlk olun.