จัดการ 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 ตามตารางด้านล่าง
| โปรแกรม | Ubuntu | AlmaLinux / Rocky |
|---|---|---|
| Apache | apache2 | httpd |
| SSH | ssh | sshd |
| PHP-FPM | php8.3-fpm (ตามเวอร์ชัน) | php-fpm |
| MariaDB / MySQL | mariadb หรือ mysql | mariadb หรือ mysqld |
| Cron | cron | crond |
ถ้าไม่แน่ใจชื่อ ให้ค้นด้วย 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-restart | reload ถ้า 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
ตรวจสอบผลลัพธ์
systemctl is-active myappตอบactivesystemctl is-enabled myappตอบenabledsystemctl --failedแสดง0 loaded units listed- ถ้าเป็นไปได้ ให้รีบูตเครื่องในช่วงที่ไม่มีผู้ใช้ แล้วตรวจอีกครั้งว่า 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 ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี


