ข้ามไปยังเนื้อหา
ToolMug

ใช้ ↑ ↓ เพื่อเลื่อน, Enter เพื่อเปิด, Esc เพื่อปิด

ตัวสร้างไฟล์ service ของ systemd

ให้โปรแกรม Node.js, Python หรือ Go ทำงานต่อเนื่องบนเซิร์ฟเวอร์ Linux เริ่มเองตอนบูต และเริ่มใหม่เมื่อล่ม โดยไม่ต้องจำตัวเลือกของ systemd ทุกอย่าง ใส่คำสั่งและผู้ใช้ เลือกนโยบาย Restart และตัวแปรสภาพแวดล้อม แล้วคัดลอกไฟล์ .service พร้อมคำสั่งติดตั้งและเริ่มใช้งาน ติ๊ก “รันตามตารางเวลา” เพื่อได้ .timer ที่เป็นทางเลือกสมัยใหม่แทน cron

ทำงานในเบราว์เซอร์ของคุณ ข้อมูลที่คุณป้อนจะไม่ถูกอัปโหลด

จะกลายเป็นชื่อไฟล์ เช่น myapp → myapp.service

ใช้พาธเต็มของโปรแกรม เช่น /usr/bin/python3 app.py

คำสั่งทำงานต่อเนื่องใน foreground (เว็บแอปและสคริปต์ส่วนใหญ่)

หนึ่งบรรทัดต่อหนึ่ง KEY=value ค่าที่มีเว้นวรรคจะถูกใส่เครื่องหมายคำพูดให้อัตโนมัติ

0 คือใช้ค่าเริ่มต้นของระบบ

myapp.service

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

วางคำสั่งบนเซิร์ฟเวอร์ในฐานะ root หลังแก้ไฟล์ unit ให้รัน systemctl daemon-reload อีกครั้ง ดูบันทึก: journalctl -u <name>

วิธีใช้งาน

  1. ใส่ชื่อบริการ คำสั่งพร้อมพาธเต็ม และไดเรกทอรีทำงาน
  2. ตั้งค่าผู้ใช้ นโยบาย Restart และตัวแปรสภาพแวดล้อมที่ต้องการ
  3. เพิ่มการเสริมความปลอดภัยพื้นฐาน หรือตารางเวลา (OnCalendar) เพื่อสร้าง timer ได้ตามต้องการ
  4. คัดลอกไฟล์ที่สร้างขึ้น หรือวางคำสั่งติดตั้งใน root shell บนเซิร์ฟเวอร์

คำอธิบายตัวเลือก

Type
simple เหมาะกับโปรแกรมที่ทำงานค้างใน foreground ส่วน oneshot เหมาะกับสคริปต์ที่รันครั้งเดียว เช่น งานตามกำหนดเวลา
Restart
“เมื่อล้มเหลว” จะเริ่มบริการใหม่เมื่อจบด้วยข้อผิดพลาดหรือล่ม ส่วน “ทุกครั้ง” จะเริ่มใหม่แม้จบการทำงานตามปกติ
OnCalendar
เวลาที่ timer ทำงาน เช่น daily หรือ *-*-* 03:00:00 สำหรับตี 3 ทุกวัน ทดสอบนิพจน์ด้วย systemd-analyze calendar

ตัวอย่าง: งานประจำคืนเป็น timer

หากต้องการรันสคริปต์ทุกคืนเวลา 3 โมงเช้า ให้ตั้งคำสั่ง (ExecStart) เป็น /usr/local/bin/backup.sh ชื่อบริการเป็น backup Type เป็น oneshot และ Restart เป็น Never แล้วติ๊ก “รันตามตารางเวลา (สร้าง .timer)” และ “เสริมความปลอดภัยพื้นฐาน” ด้วยผู้ใช้และไดเรกทอรีทำงานเริ่มต้น ตัวสร้างได้สองไฟล์ backup.service:

[Unit]
Description=Nightly backup

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/srv/myapp
ExecStart=/usr/local/bin/backup.sh
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=read-only

และ backup.timer:

[Unit]
Description=Run backup on a schedule

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
Unit=backup.service

[Install]
WantedBy=timers.target

เมื่อเปิด timer มีสองอย่างที่เปลี่ยน ไฟล์ service ไม่มีส่วน [Install] เพราะ timer เป็นผู้เริ่มมันแทน และคำสั่งติดตั้งจะเปิดใช้ timer แทน service:

sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
journalctl -u backup.service -f

Type ไม่ถูกเปลี่ยนให้เมื่อคุณติ๊กตัวเลือก timer ดังนั้นให้เลือก oneshot เองสำหรับงานที่ทำเสร็จแล้วจบ บริการ oneshot ที่ใช้ร่วมกับ Restart Always ไม่ถูกต้อง ตัวสร้างจึงละ Restart ไว้และแสดงคำเตือน

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

ควรวางไฟล์ไว้ที่ไหน

ที่ /etc/systemd/system/ แล้วรัน systemctl daemon-reload และ systemctl enable --now <name>.service คำสั่งที่สร้างขึ้นทำทั้งหมดนี้ให้แล้ว

ทำไมบริการของฉันล้มเหลวพร้อมข้อความ “Executable path is not absolute”

systemd รุ่นเก่าต้องใช้พาธเต็มของโปรแกรมใน ExecStart ค้นหาได้ด้วย which เช่น which node

ใช้ timer หรือ cron ดี

timer บันทึกลงใน journal ชดเชยรอบที่พลาดไปตอนเซิร์ฟเวอร์ปิดได้ และไม่รันซ้อนกันสองครั้ง ส่วน cron ง่ายกว่าสำหรับคำสั่งบรรทัดเดียวและยังใช้งานได้ดี

ความเป็นส่วนตัว

เครื่องมือนี้ทำงานในเบราว์เซอร์ของคุณทั้งหมด ไฟล์และข้อความของคุณได้รับการประมวลผลบนอุปกรณ์ของคุณ และจะไม่ถูกอัปโหลดไปยังเซิร์ฟเวอร์ของเรา

เครื่องมือที่เกี่ยวข้อง