มีสองทางที่บอท "ไม่ทำงาน" บนเซิร์ฟเวอร์ อันชัดเจน: มันหยุดวินาทีที่คุณปิด SSH อันแอบแฝง: มันรันดีสองวัน แครชตอนตีสี่บนข้อผิดพลาดที่ไม่ได้จัดการบางตัว และคุณรู้ชั่วโมงถัดมาเมื่อใครถามว่าทำไมมันล่ม ทั้งสองมีการแก้เดียวกัน และมันไม่ใช่ "จำรีสตาร์ทมัน" — มันคือการมอบงานให้ systemd ซึ่งเก็บสิ่งต่าง ๆ ให้อยู่เพื่อคุณไม่ต้อง
ทำไมมันตายเมื่อคุณ log out
หากคุณเปิดมันด้วย python bot.py ในเซสชัน SSH ของคุณ โปรเซสเป็นลูกของเซสชันนั้น ปิดเซสชัน โปรเซสไปกับมัน nohup และ & กลบเรื่องนี้ แต่มันไม่ให้ restart-on-crash และไม่ให้ start-on-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— บอทแครช systemd นำมันกลับใน 5 วินาที การตายตอนตีสี่นั้นกลายเป็นการกะพริบ 5 วินาทีที่ไม่มีใครสังเกตenable— มันเริ่มอีกครั้งหลังรีบูต เอง ไม่มี "โอ้ เซิร์ฟเวอร์รีสตาร์ทและฉันลืมเปิดทุกอย่างใหม่"
เมื่อมันยังงอแง — อ่าน log
บอทที่แครชวนไม่ถูกแก้ด้วยการรีสตาร์ทหนักขึ้น มีอะไรผิดจริง systemd จับ stdout/stderr ดังนั้น:
systemctl status mybot # ขึ้นหรือลง exit code ล่าสุด
journalctl -u mybot -n 100 # log ล่าสุด + ข้อผิดพลาดที่มันตายด้วย
journalctl -u mybot -f # ติดตามสด
สาเหตุแทบเสมออยู่ตรงนั้น: env var ที่หาย exception ที่ไม่ได้จัดการ API timeout การ kill OOM แก้นั่น — Restart=always คือตาข่ายความปลอดภัย ไม่ใช่ยารักษาบั๊กจริง
เคล็ดลับ: หาก log แสดงบอทถูก kill เพราะหน่วยความจำ คุณโตเกินเครื่อง — ดูคู่มือกำหนดขนาด
เมื่อ tmux หรือ pm2 เหมาะแทน
systemd ไม่ใช่คำตอบเดียว แค่ค่าเริ่มต้นที่ดีที่สุด:
- tmux — เหมาะสำหรับการทดสอบเร็วหรือดูโปรเซสโต้ตอบ รัน detach reattach ภายหลัง แต่มันจะไม่รีสตาร์ทเมื่อแครชหรือรอดรีบูต ดังนั้นไม่ใช่สำหรับโปรดักชัน
- pm2 — สมเหตุสมผลหากคุณอยู่ในโลก Node แล้วและอยากได้แดชบอร์ดโปรเซสของมัน ข้อแม้: pm2 เองเป็นโปรเซสที่คุณต้องเก็บให้มีชีวิต (มักผ่าน systemd) สำหรับบอทเดียว นั่นคือชั้นที่คุณไม่ต้องการ
สำหรับบอทหรือ agent ออนไลน์เสมอเดียว systemd คือสิ่งที่ง่ายที่สุดที่ทำงานได้จริง — มันอยู่บนเซิร์ฟเวอร์แล้ว ไม่ต้องมีเครื่องมือเพิ่ม และทำ restart, boot-start และ logging ทันที
บรรทัดสุดท้ายที่ตรงไปตรงมา
อัปไทม์ไม่เกี่ยวกับเซิร์ฟเวอร์ใหญ่กว่าหรือวินัยมากกว่า — มันเกี่ยวกับการไม่ผูกโปรเซสของคุณกับแล็ปท็อป ห่อมันใน systemd unit ด้วย Restart=always และ enable และตรวจ journalctl เมื่อมีอะไรผิด ทำนั่นครั้งเดียวและบอทของคุณอยู่ไม่ว่าคุณเฝ้าดูหรือหลับ (เครื่องใหม่? ล็อกมันก่อน — บอท 24/7 ก็เป็นเป้าหมาย 24/7)
ต้องการที่รันมันไหม? แพ็กเกจ Nano ($3/เดือน) เก็บบอทให้มีชีวิต 24/7 — systemd ทำที่เหลือ
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ