Un bot „nu merge” pe un server în două feluri. Felul evident: se oprește în secunda în care închizi SSH. Felul perfid: merge bine două zile, pică la 4 dimineața din cauza unei erori netratate și afli după câteva ore, când te întreabă cineva de ce nu răspunde. Ambele au aceeași soluție, și nu e „ține minte să-l repornești” — e să-i dai treaba lui systemd, care ține lucrurile pornite ca să nu trebuiască s-o faci tu.
De ce moare când ieși din sesiune
Dacă l-ai pornit cu python bot.py în sesiunea SSH, procesul e un copil al acelei sesiuni. Închizi sesiunea, procesul pleacă odată cu ea. nohup și & acoperă asta, dar nu-ți dau nici repornire după căderi, nici pornire la boot — deci ai rezolvat problema mică și ai păstrat-o pe cea mare.
Soluția reală: un serviciu systemd
Asta e tot. Creează /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
Două linii fac munca grea:
Restart=always— botul pică, systemd îl readuce în 5 secunde. Moartea de la 4 dimineața devine o clipire de 5 secunde pe care n-o observă nimeni.enable— pornește din nou singur după o repornire. Fără „a, serverul a repornit și am uitat să relansez totul”.
Când tot se poartă urât — citește logurile
Un bot care intră mereu în bucla de căderi nu se repară repornindu-l mai tare; chiar e ceva în neregulă. systemd capturează stdout/stderr, așa că:
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
Cauza e aproape întotdeauna chiar acolo: o variabilă de mediu lipsă, o excepție netratată, un timeout de API, o oprire din lipsă de memorie. Repar-o pe aceea — Restart=always e o plasă de siguranță, nu un leac pentru un bug real.
Sfat: dacă logurile arată că botul e oprit din lipsă de memorie, ai depășit mașina — verifică ghidul de dimensionare.
Când se potrivesc în schimb tmux sau pm2
systemd nu e singurul răspuns, doar cea mai bună alegere implicită:
- tmux — perfect pentru un test rapid sau ca să urmărești un proces interactiv. Rulezi, te detașezi, te reatașezi mai târziu. Dar nu repornește după căderi și nu supraviețuiește unei reporniri, deci nu e pentru producție.
- pm2 — rezonabil dacă ești deja în lumea Node și vrei panoul lui de procese. Capcana: pm2 e el însuși un proces pe care acum trebuie să-l ții în viață (de obicei... prin systemd). Pentru un singur bot, e un strat de care nu ai nevoie.
Pentru un singur bot sau agent mereu pornit, systemd e cel mai simplu lucru care chiar funcționează — e deja pe server, nu cere unelte în plus și face din prima repornirea, pornirea la boot și logurile.
Concluzia cinstită
Disponibilitatea nu ține de un server mai mare sau de mai multă disciplină — ține de a nu-ți lega procesul de laptop. Pune-l într-o unitate systemd cu Restart=always și enable și verifică journalctl când ceva nu e în regulă. Fă asta o dată și botul tău rămâne pornit, fie că te uiți, fie că dormi. (Mașină nouă? Închide-o întâi — un bot 24/7 e și o țintă 24/7.)
Ai nevoie de un loc unde să-l rulezi? Un plan Nano ($3/lună) ține un bot în viață 24/7 — systemd face restul.
Comentarii
Încă nu există comentarii. Fii primul.