EQVPS

วิธีสร้างเซอร์วิส systemd เพื่อให้แอปทำงานต่อเนื่อง

เปลี่ยนสคริปต์หรือแอปใด ๆ ให้เป็นเซอร์วิสที่มีการจัดการ ซึ่งเริ่มเมื่อบูต รีสตาร์ทหากแครช และบันทึกลง journalctl เขียนไฟล์ unit เปิดใช้งาน และตรวจสอบสถานะ — วิธีมาตรฐานในการรันบางอย่าง 24/7 บน Linux

การรันแอปด้วย & หรือ nohup นั้นดีอยู่จนกว่าเซิร์ฟเวอร์จะรีบูต โปรเซสแครช หรือคุณอยากหาล็อกของมัน — แล้วมันก็พังทลาย systemd คือคำตอบมาตรฐาน: มันเริ่มแอปของคุณเมื่อบูต รีสตาร์ทหากมันตาย และจับล็อกของมัน การเปลี่ยนสคริปต์หรือไบนารีให้เป็นเซอร์วิสที่มีการจัดการคือไฟล์เล็ก ๆ ไฟล์เดียว

1. เขียนไฟล์ unit

สร้าง /etc/systemd/system/myapp.service:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

ปรับ ExecStart, WorkingDirectory และ User ให้ตรงกับแอปของคุณ Restart=always คือสิ่งที่ทำให้มันมีชีวิตอยู่

2. สร้างผู้ใช้เฉพาะ (แนะนำ)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

การรันเป็นผู้ใช้ที่ไม่ใช่ root จำกัดความเสียหายหากแอปถูกเจาะสักวันหนึ่ง

3. เปิดใช้งานและเริ่มมัน

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable ทำให้มันเริ่มเมื่อบูต; --now เริ่มมันทันที

4. ตรวจสอบสถานะและล็อก

sudo systemctl status myapp
journalctl -u myapp -f       # ติดตามล็อกสด

คำสั่งประจำวัน

sudo systemctl restart myapp   # รีสตาร์ทหลังการเปลี่ยนแปลง
sudo systemctl stop myapp      # หยุดมัน
sudo systemctl disable myapp   # เลิกเริ่มเมื่อบูต

คำเตือนตามตรง

ขั้นตอนถัดไป

เซอร์วิส systemd คือวิธีที่คุณทำให้อะไรก็ตามทำงาน 24/7 — เช่น เอเจนต์ AI ที่รันตลอดเวลา หรือรีเลย์เบื้องหลัง เซิร์ฟเวอร์ RustDesk แบบ self-host หากแอปของคุณถูกทำเป็นคอนเทนเนอร์แทน --restart unless-stopped ของ Docker เล่นบทบาทเดียวกัน — ดู วิธีติดตั้ง Docker

คำถามที่พบบ่อย

ทำไมต้องใช้ systemd แทนที่จะแค่รันแอปในเบื้องหลัง?

โปรเซสในเบื้องหลัง (ด้วย & หรือ nohup) จะตายเมื่อรีบูต ไม่กลับมาหากแครช และกระจายล็อกของมัน เซอร์วิส systemd เริ่มอัตโนมัติเมื่อบูต รีสตาร์ทเมื่อล้มเหลว และส่งเอาต์พุตไปยัง journalctl มันคือวิธีมาตรฐานที่เชื่อถือได้ในการรันสิ่งที่อยู่ยาวบน Linux

ไฟล์ unit อยู่ที่ไหน?

เซอร์วิสของคุณเองอยู่ใน /etc/systemd/system/ หนึ่งไฟล์ต่อหนึ่งเซอร์วิส ตั้งชื่อแบบ something.service หลังจากสร้างหรือแก้ไข ให้รัน 'systemctl daemon-reload' เพื่อให้ systemd รับการเปลี่ยนแปลง จากนั้นเปิดใช้งานและเริ่มมัน

'Restart=always' ทำอะไร และมีข้อเสียไหม?

มันบอก systemd ให้รีสตาร์ทเซอร์วิสทุกครั้งที่มันออก ไม่ว่าด้วยเหตุใด — กุญแจสำคัญในการทำให้บางอย่างทำงานต่อ กับดักเดียวคือลูปการแครช: หากแอปล้มเหลวทันทีเมื่อเริ่ม systemd จะรีสตาร์ทมันเรื่อย ๆ เพิ่ม 'RestartSec=5' เพื่อเว้นระยะการลอง และตรวจล็อกเพื่อแก้ข้อผิดพลาดต้นเหตุ

ฉันดูล็อกของเซอร์วิสอย่างไร?

ใช้ 'journalctl -u yourservice -f' เพื่อติดตามเอาต์พุตสด หรือไม่ใส่ -f เพื่ออ่านประวัติ systemd จับ stdout และ stderr อัตโนมัติ คุณจึงไม่ต้องต่อไฟล์ล็อกเอง

เซอร์วิสควรรันเป็น root ไหม?

ควรเลี่ยง สร้างผู้ใช้เฉพาะที่ไม่ใช่ root และตั้ง 'User=' ใน unit เพื่อว่าการถูกเจาะของแอปจะไม่ยกเครื่องทั้งเครื่องให้ไป รันเป็น root เฉพาะเมื่อเซอร์วิสจำเป็นจริง ๆ

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง