ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home จัดการ Service บน Linux ด้วย systemctl

จัดการ Service บน Linux ด้วย systemctl

Linux รุ่นปัจจุบันทั้ง Ubuntu และ AlmaLinux/Rocky ใช้ systemd เป็นตัวจัดการ Service ไม่ว่าจะเป็น Nginx, Apache, MySQL, PHP-FPM หรือ SSH ล้วนเป็น Unit ที่ควบคุมผ่านคำสั่ง systemctl ทั้งสิ้น บทความนี้สอนคำสั่งที่ใช้บ่อย วิธีอ่านสถานะ และวิธีสร้าง Service สำหรับแอปของคุณเองให้เปิดอัตโนมัติเมื่อเครื่องรีบูต

สิ่งที่ต้องเตรียม

  • เซิร์ฟเวอร์ Ubuntu 22.04/24.04 หรือ AlmaLinux/Rocky Linux 8-9
  • ผู้ใช้ที่มีสิทธิ์ sudo (การดูสถานะไม่ต้องใช้ sudo แต่การสั่งเปลี่ยนสถานะต้องใช้)
  • ชื่อ Service ที่ถูกต้อง ซึ่งบางตัวต่างกันตาม Distribution ตามตารางด้านล่าง
โปรแกรมUbuntuAlmaLinux / Rocky
Apacheapache2httpd
SSHsshsshd
PHP-FPMphp8.3-fpm (ตามเวอร์ชัน)php-fpm
MariaDB / MySQLmariadb หรือ mysqlmariadb หรือ mysqld
Croncroncrond

ถ้าไม่แน่ใจชื่อ ให้ค้นด้วย systemctl list-unit-files | grep -i php

ขั้นตอนที่ 1: ดูสถานะ Service

systemctl status nginx

ผลลัพธ์ที่ปกติจะมีลักษณะดังนี้

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Fri 2026-09-18 09:15:02 +07; 1 day ago
   Main PID: 812 (nginx)

ให้ดู 2 บรรทัดหลัก บรรทัด Loaded บอกตำแหน่ง Unit File และคำว่า enabled หมายถึงเปิดอัตโนมัติตอนบูต บรรทัด Active บอกสถานะปัจจุบัน ได้แก่ active (running) กำลังทำงาน inactive (dead) หยุดอยู่ และ failed ล้มเหลว ด้านล่างสุดจะมี Log ล่าสุดของ Service นั้นประมาณ 10 บรรทัด กด q เพื่อออก

สำหรับใช้ในสคริปต์ มีคำสั่งที่ให้ผลสั้นกว่า

systemctl is-active nginx
systemctl is-enabled nginx

ขั้นตอนที่ 2: Start, Stop, Restart และ Reload

sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
คำสั่งผลใช้เมื่อ
restartหยุดแล้วเริ่มใหม่ การเชื่อมต่อที่ค้างอยู่จะถูกตัดอัปเดตโปรแกรม หรือ Service ค้าง
reloadอ่าน Config ใหม่โดยไม่หยุด Process หลักแก้ Config ของ Nginx, Apache, PHP-FPM
reload-or-restartreload ถ้า Service รองรับ ไม่เช่นนั้น restartใช้ในสคริปต์ที่ไม่แน่ใจว่ารองรับ reload

ก่อน reload หรือ restart Web Server ควรทดสอบ Config ก่อนเสมอ ถ้า Config ผิด Service จะไม่ขึ้นมาและเว็บล่ม

sudo nginx -t
sudo apachectl configtest
sudo systemctl reload nginx

ผลที่ถูกต้องของ nginx -t คือ syntax is ok และ test is successful ส่วน Apache จะแสดง Syntax OK

หมายเหตุ: การ restart Service SSH หลังแก้ Config ไม่ตัด Session ที่เปิดอยู่ แต่ถ้า Config ผิดจะเข้าใหม่ไม่ได้ ให้ทดสอบด้วย sudo sshd -t ก่อน restart และเปิดหน้าต่าง SSH ที่สองเพื่อทดสอบเข้าก่อนปิดหน้าต่างเดิม บน Ubuntu 24.04 SSH ทำงานผ่าน ssh.socket จึงมีขั้นตอนเพิ่ม ดู วิธีเปลี่ยน SSH Port บน Linux Server

ขั้นตอนที่ 3: ตั้งให้เปิดอัตโนมัติตอนบูต

sudo systemctl enable nginx
sudo systemctl enable --now redis-server
sudo systemctl disable apache2
sudo systemctl disable --now apache2

enable ตั้งให้เปิดตอนบูตเท่านั้น ไม่ได้เริ่ม Service ทันที ถ้าต้องการทั้งสองอย่างให้ใส่ --now เช่นเดียวกับ disable --now ที่ทั้งหยุดทันทีและไม่ให้เปิดตอนบูต

ถ้าต้องการกันไม่ให้ Service ถูกเปิดโดยเด็ดขาด แม้โปรแกรมอื่นจะเรียกใช้ ให้ใช้ mask และยกเลิกด้วย unmask

sudo systemctl mask apache2
sudo systemctl unmask apache2

ตัวอย่างที่ใช้จริงคือเครื่องที่ติดตั้งทั้ง Apache และ Nginx ซึ่งแย่งพอร์ต 80 กัน การ mask ตัวที่ไม่ใช้ช่วยกันไม่ให้มันขึ้นมาหลังอัปเดตแพ็กเกจ

ขั้นตอนที่ 4: หา Service ที่ล้ม

systemctl --failed
systemctl list-units --type=service --state=running
systemctl list-unit-files --type=service --state=enabled

systemctl --failed เป็นคำสั่งแรกที่ควรรันเมื่อสงสัยว่ามีบางอย่างไม่ทำงานหลังรีบูต ถ้าพบ Service ที่ failed ให้ดู Log เต็มด้วย

sudo journalctl -u nginx -n 50 --no-pager

วิธีกรองและอ่าน Log อย่างละเอียดอยู่ใน อ่าน Log ระบบบน Linux ด้วย journalctl หลังแก้สาเหตุแล้ว ให้ล้างสถานะ failed ด้วย sudo systemctl reset-failed nginx แล้ว start ใหม่

ขั้นตอนที่ 5: สร้าง Service สำหรับแอปของคุณเอง

สมมติมีแอป Python หรือ Go ที่รันด้วยคำสั่ง /opt/myapp/bin/myapp และต้องการให้รันด้วยผู้ใช้ myapp เปิดเองตอนบูต และเริ่มใหม่อัตโนมัติเมื่อล้ม ให้สร้างไฟล์ /etc/systemd/system/myapp.service

sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=-/opt/myapp/.env
ExecStart=/opt/myapp/bin/myapp
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

จากนั้นโหลด Unit File ใหม่และเปิดใช้งาน

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

Restart=on-failure ให้ systemd เริ่มแอปใหม่เมื่อ Process จบด้วย Error ส่วนเครื่องหมาย - หน้า Path ของ EnvironmentFile หมายความว่าไม่ต้อง Error ถ้าไม่มีไฟล์นั้น สำหรับแอป Node.js อาจใช้ PM2 แทนได้ ดู รันแอป Node.js ด้วย PM2 และ Nginx Reverse Proxy

ขั้นตอนที่ 6: ปรับค่า Service ของแพ็กเกจโดยไม่แก้ไฟล์ต้นฉบับ

อย่าแก้ไฟล์ใน /usr/lib/systemd/system/ หรือ /lib/systemd/system/ โดยตรง เพราะจะถูกเขียนทับเมื่ออัปเดตแพ็กเกจ ให้สร้าง Drop-in แทน

sudo systemctl edit mariadb

คำสั่งนี้เปิด Editor ให้ใส่เฉพาะค่าที่ต้องการเปลี่ยน เช่น เพิ่มจำนวนไฟล์ที่เปิดได้

[Service]
LimitNOFILE=65535

เมื่อบันทึก systemd จะสร้างไฟล์ /etc/systemd/system/mariadb.service.d/override.conf และโหลดให้เอง จากนั้น restart Service เพื่อให้ค่ามีผล ดูผลรวมของ Unit พร้อม Drop-in ได้ด้วย systemctl cat mariadb

ตรวจสอบผลลัพธ์

  1. systemctl is-active myapp ตอบ active
  2. systemctl is-enabled myapp ตอบ enabled
  3. systemctl --failed แสดง 0 loaded units listed
  4. ถ้าเป็นไปได้ ให้รีบูตเครื่องในช่วงที่ไม่มีผู้ใช้ แล้วตรวจอีกครั้งว่า Service ขึ้นมาเอง

ปัญหาที่พบบ่อย

Unit nginx.service not found

ชื่อ Service ผิดหรือยังไม่ได้ติดตั้งโปรแกรม ตรวจชื่อจากตารางด้านบนหรือค้นด้วย systemctl list-unit-files

Warning: The unit file changed on disk

แก้ไฟล์ Unit แล้วยังไม่ได้โหลดใหม่ ให้รัน sudo systemctl daemon-reload แล้ว restart Service

Service start แล้วล้มทันที (Active: failed)

ดูบรรทัดท้ายของ systemctl status และ journalctl -u สาเหตุที่พบบ่อยคือ Config ผิด พอร์ตถูกโปรแกรมอื่นใช้อยู่ (Address already in use ตรวจด้วย sudo ss -tulpn) หรือผู้ใช้ของ Service ไม่มีสิทธิ์อ่านไฟล์

start request repeated too quickly

Service ล้มซ้ำจนเกินขีดจำกัดที่ systemd ยอมให้เริ่มใหม่ แก้สาเหตุจาก Log ก่อน แล้วรัน sudo systemctl reset-failed ชื่อservice จึงจะ start ได้อีกครั้ง

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อเซิร์ฟเวอร์ ระบบปฏิบัติการ คำสั่งที่ใช้ และข้อความ Error ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security