การรันแอปด้วย & หรือ 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 # เลิกเริ่มเมื่อบูต
คำเตือนตามตรง
- รัน
daemon-reloadหลังแก้ไข ไฟล์ unit มิฉะนั้น systemd จะใช้เวอร์ชันเก่า - ระวังลูปการแครช หากแอปล้มเหลวทันที
Restart=alwaysจะลองซ้ำตลอดไป —RestartSec=5เว้นระยะการลอง; แก้ข้อผิดพลาดต้นเหตุผ่านล็อก - เลือกใช้
User=ที่ไม่ใช่ root เพื่อว่าแอปที่ถูกเจาะจะไม่เป็นเจ้าของเซิร์ฟเวอร์ทั้งเครื่อง
ขั้นตอนถัดไป
เซอร์วิส systemd คือวิธีที่คุณทำให้อะไรก็ตามทำงาน 24/7 — เช่น เอเจนต์ AI ที่รันตลอดเวลา หรือรีเลย์เบื้องหลัง เซิร์ฟเวอร์ RustDesk แบบ self-host หากแอปของคุณถูกทำเป็นคอนเทนเนอร์แทน --restart unless-stopped ของ Docker เล่นบทบาทเดียวกัน — ดู วิธีติดตั้ง Docker
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ