วิธีใช้งาน
- ใส่ชื่อบริการ คำสั่งพร้อมพาธเต็ม และไดเรกทอรีทำงาน
- ตั้งค่าผู้ใช้ นโยบาย Restart และตัวแปรสภาพแวดล้อมที่ต้องการ
- เพิ่มการเสริมความปลอดภัยพื้นฐาน หรือตารางเวลา (OnCalendar) เพื่อสร้าง timer ได้ตามต้องการ
- คัดลอกไฟล์ที่สร้างขึ้น หรือวางคำสั่งติดตั้งใน 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 ง่ายกว่าสำหรับคำสั่งบรรทัดเดียวและยังใช้งานได้ดี
ความเป็นส่วนตัว
เครื่องมือนี้ทำงานในเบราว์เซอร์ของคุณทั้งหมด ไฟล์และข้อความของคุณได้รับการประมวลผลบนอุปกรณ์ของคุณ และจะไม่ถูกอัปโหลดไปยังเซิร์ฟเวอร์ของเรา