دوه لارې شته چې یو bot په یوه سرور «کار نه کوي». څرګنده یې: دا هغه ثانیه درولوي چې تاسو SSH بندوئ. پټه یې: دا د دوو ورځو لپاره ښه چلیږي، د سهار په ۴ بجو په یوه غیر-اداره شوي تیروتنه crash کوي، او تاسو ساعتونه وروسته پوهیږئ کله چې یو څوک وپوښتي چې ولې کوز دی. دواړه همدا حل لري، او دا «یاد ولره چې بیا یې پیل کړه» نه دی — دا دنده systemd ته سپارل دي، چې شیان پورته ساتي نو تاسو یې ونه ساتئ.
ولې دا مري کله چې تاسو ووځئ
که تاسو دا د python bot.py سره ستاسو په SSH سیشن پیل کړ، پروسس د هغه سیشن یو ماشوم دی. سیشن بند کړئ، پروسس ورسره ځي. nohup او & دا پټوي، خو تاسو ته هیڅ په-crash-بیا-پیل او هیڅ په-boot-پیل نه درکوي — نو تاسو کوچنۍ ستونزه حل کړه او لویه مو وساتله.
ریښتینی حل: یو 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— bot crash کوي، systemd یې په ۵ ثانیو کې بیرته راولي. هغه د سهار ۴ بجو مرګ یو ۵-ثانیهای ټکان کیږي چې هیڅوک یې نه ګوري.enable— دا د یوه بیا پیل وروسته پخپله بیا پیلیږي. هیڅ «اوه، سرور بیا پیل شو او ما هیر کړل چې هر څه بیا پیل کړم» نشته.
کله چې دا لا بد چلند کوي — logونه ولولئ
یو bot چې crash-loop کولو ته دوام ورکوي په سخت بیا پیل سره نه سمیږي؛ یو څه واقعاً غلط دي. 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
لامل نږدې تل همدلته دی: یو ورک شوی چاپیریال متغیر، یو غیر-اداره شوی استثنا، یو API timeout، یو OOM kill. هغه سم کړئ — Restart=always یو د خوندیتوب جال دی، نه د یوه ریښتیني bug درمل.
لارښوونه: که logونه ښیي چې bot د حافظې لپاره وژل کیږي، تاسو box ماتولی — د اندازهکولو لارښود وګورئ.
کله چې tmux یا pm2 پرځای معنی لري
systemd یوازینی ځواب نه دی، یوازې غوره ډیفالټ:
- tmux — د یوې چټکې ازموینې یا د یوه تعاملي پروسس کتلو لپاره بشپړ. وچلوئ، جلا کړئ، وروسته بیا ونښلوئ. خو دا په crash بیا نه پیلیږي او د یوه بیا پیل ژوندی نه پاتې کیږي، نو د تولید لپاره نه دی.
- pm2 — معقول دی که تاسو لا دمخه په Node نړۍ کې یاست او د هغه پروسس ډشبورډ غواړئ. خنډ: pm2 پخپله یو پروسس دی چې تاسو یې اوس روان ساتلو ته اړتیا لرئ (معمولاً... د systemd له لارې). د یوه bot لپاره، دا یو طبقه ده چې تاسو ورته اړتیا نلرئ.
د یوه واحد تل-فعال bot یا اجنټ لپاره، systemd ترټولو ساده شی دی چې واقعاً کار کوي — دا لا دمخه په سرور دی، هیڅ اضافي وسیلې ته اړتیا نلري، او بیا پیل، په-boot-پیل او logging له بکس څخه کوي.
ریښتینی کتاکلی
اپټایم د یوه لوی سرور یا نور نظم په اړه نه دی — دا د دې په اړه دی چې خپل پروسس خپل laptop سره ونه تړئ. دا په یوه systemd unit کې د Restart=always او enable سره ونغاړئ، او کله چې یو څه ناسم وي journalctl وګورئ. دا یو ځل وکړئ او ستاسو bot پورته پاتې کیږي که تاسو ګورئ که ویده یاست. (نوی box؟ لومړی یې قفل کړئ — یو ۲۴/۷ bot یو ۲۴/۷ هدف هم دی.)
د چلولو لپاره یو ځای ته اړتیا لرئ؟ یو Nano پلان ($3/میاشت) یو bot ۲۴/۷ ژوندی ساتي — systemd پاتې کوي.
تبصرې
لا تبصرې نشته. لومړی اوسئ.