گرمای تابستان — همه‌چیز آب می‌شود، حتی قیمت‌های ما.−25%−۲۵٪ روی هر پلن سالانه، تا ۳۱ اوتدیدن پلن‌ها
EQVPS

یک ربات را به‌صورت شبانه‌روزی روی VPS فعال نگه دارید (تا هرگز بی‌صدا نمیرد)

25 خرداد 1405 · 3 دقیقه مطالعه · EQVPS Team

یک ربات به دو شکل روی سرور «کار نمی‌کند». شکل آشکار: لحظه‌ای که 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

دو خط بار اصلی را به دوش می‌کشند:

وقتی هنوز بدرفتاری می‌کند — لاگ‌ها را بخوانید

رباتی که مدام در حلقه کرش می‌افتد با محکم‌تر ری‌استارت‌کردن درست نمی‌شود؛ چیزی واقعاً اشکال دارد. systemd خروجی stdout/stderr را ثبت می‌کند، پس:

systemctl status mybot          # بالا یا پایین، آخرین کد خروج
journalctl -u mybot -n 100      # لاگ‌های اخیر + خطایی که رویش مرد
journalctl -u mybot -f          # دنبال‌کردن زنده

علت تقریباً همیشه همان‌جاست: یک متغیر محیطی گمشده، یک استثنای مدیریت‌نشده، یک timeout در API، یک OOM kill. آن را درست کنید — Restart=always یک تور ایمنی است، نه درمان یک باگ واقعی.

نکته: اگر لاگ‌ها نشان می‌دهند ربات به‌خاطر حافظه کشته می‌شود، از سرور بزرگ‌تر شده‌اید — راهنمای اندازه‌گیری را ببینید.

چه زمانی به‌جایش tmux یا pm2 منطقی است

systemd تنها پاسخ نیست، فقط بهترین پیش‌فرض است:

برای یک ربات یا عامل تک و همیشه‌فعال، systemd ساده‌ترین چیزی است که واقعاً کار می‌کند — همین حالا روی سرور هست، به ابزار اضافی نیاز ندارد، و ری‌استارت، شروع در بوت و لاگ‌گیری را از همان ابتدا انجام می‌دهد.

خلاصه صادقانه کلام

آپ‌تایم درباره یک سرور بزرگ‌تر یا انضباط بیشتر نیست — درباره گره‌نزدن فرایندتان به لپ‌تاپ‌تان است. آن را در یک unit از systemd با Restart=always و enable بپیچید، و وقتی چیزی خطاست journalctl را چک کنید. این را یک بار انجام دهید و ربات‌تان چه بیدار باشید چه خواب، بالا می‌ماند. (سرور تازه؟ اول محکمش کنید — یک ربات شبانه‌روزی، یک هدف شبانه‌روزی هم هست.)


جایی برای اجرایش می‌خواهید؟ یک پلن Nano (‏۳ دلار در ماه) یک ربات را به‌صورت شبانه‌روزی زنده نگه می‌دارد — بقیه‌اش را systemd انجام می‌دهد.

سؤالات متداول

چرا وقتی SSH را می‌بندم ربات من متوقف می‌شود؟

چون آن را داخل نشست SSH خود اجرا کرده‌اید، پس به آن نشست گره خورده و وقتی قطع می‌شوید می‌میرد. راه‌حل این است که آن را به‌صورت یک سرویس پس‌زمینه که مستقل از ورود شماست اجرا کنید — systemd راه تمیز است، ‏tmux راه سریع است.

چطور یک ربات را هنگام کرش به‌طور خودکار ری‌استارت کنم؟

آن را به‌صورت یک سرویس systemd با Restart=always و یک تأخیر کوچک RestartSec اجرا کنید. آن‌وقت systemd ظرف چند ثانیه پس از هر کرش، بی‌نهایت و بدون نظارت، فرایند را دوباره اجرا می‌کند. همان یک خط تفاوت میان «ساعت ۴ بامداد مرد» و «یک لحظه قطع شد و برگشت» است.

چطور کاری کنم یک ربات بعد از ری‌بوت به‌طور خودکار شروع شود؟

سرویس‌تان را systemctl enable کنید. «enable» آن را به شروع در بوت سیم‌کشی می‌کند، «start» آن را همین حالا اجرا می‌کند — هر دو را انجام دهید (systemctl enable --now). بعد از هر ری‌بوت، ربات بدون آنکه شما وارد شوید خودش برمی‌گردد.

systemd یا pm2 یا tmux — کدام را استفاده کنم؟

systemd برای هر چیز واقعی و بلندمدت: ری‌استارت، شروع در بوت و لاگ‌گیری را به‌صورت بومی مدیریت می‌کند، بدون ابزار اضافی. tmux برای یک تست سریع یا تماشای یک اجرای تعاملی عالی است. pm2 اگر در دنیای Node زندگی می‌کنید و داشبوردش را می‌خواهید معقول است، اما چیز دیگری است که باید فعال نگهش دارید. برای یک ربات تک و همیشه‌فعال، systemd از نظر سادگی برنده است.

چطور ببینم چرا ربات من مدام کرش می‌کند؟

journalctl -u yourbot -n 100 لاگ‌های اخیر و خطایی که رویش مرده را نشان می‌دهد؛ برای دنبال‌کردن زنده -f اضافه کنید. معمولاً علت واقعی همین‌جا پنهان است — یک متغیر محیطی گمشده، یک استثنای مدیریت‌نشده، یک timeout در API. آن را درست کنید، کورکورانه ری‌استارت نکنید.

← بازگشت به وبلاگ← پلن‌ها و قیمت‌ها

نظرات

هنوز نظری نیست. اولین نفر باشید.

یک نظر بگذارید

نظرات پیش از نمایش بررسی می‌شوند.