目次

1. แนะนำเบื้องต้น

เมื่อใช้ Linux คุณอาจต้องการตรวจสอบสถานะของบริการหรือดูรายการโปรเซสที่กำลังทำงานอยู่บ่อยครั้ง ในสถานการณ์เหล่านี้ คำสั่ง systemctl จะมีประโยชน์มาก

คำสั่งนี้รองรับ “systemd” ซึ่งเป็นระบบเริ่มต้นและตัวจัดการบริการใน Linux โดยสามารถใช้ตรวจสอบสถานะของบริการ (ยูนิต) สั่งเริ่ม หยุด รีสตาร์ท และแสดงรายการบริการได้หลากหลาย

โดยเฉพาะอย่างยิ่ง ถ้ามองในแง่ของ “การแสดงรายการบริการด้วย systemctl” จะสามารถดูทั้งบริการที่กำลังทำงาน บริการที่ถูกปิดใช้งาน หรือบริการที่ตั้งค่าให้เริ่มอัตโนมัติได้จากหลายมุมมอง

ในบทนี้จะสรุปความหมายของ systemctl อย่างกระชับ และอธิบายว่าในบทความนี้คุณจะได้เรียนรู้อะไรบ้าง

systemctl คืออะไร?

systemctl คือเครื่องมือมาตรฐานในการควบคุมและตรวจสอบ “ยูนิต” ต่างๆ เช่น บริการ, ทาร์เก็ต, จุดเมาท์ ฯลฯ ใน Linux ที่ใช้ systemd

เช่น หากต้องการเริ่มหรือหยุดบริการอย่าง Apache (httpd) หรือ SSH และต้องการดูรายการสถานะของบริการเหล่านั้น systemctl จะเป็นคำสั่งหลักที่ใช้

ความสัมพันธ์ระหว่าง systemd กับ systemctl

systemd เป็นระบบหลักสำหรับการบูตและจัดการบริการใน Linux ซึ่งเข้ามาแทนที่ “SysVinit” หรือ “Upstart” ที่เคยใช้มาก่อน ส่วน systemctl คือเครื่องมือบรรทัดคำสั่งสำหรับโต้ตอบกับ systemd

เปรียบเหมือน systemd คือ “ศูนย์ควบคุม” ในขณะที่ systemctl คือ “โอเปอเรเตอร์” ที่ส่งคำสั่ง

สิ่งที่คุณจะได้เรียนรู้จากบทความนี้

บทความนี้จะตอบคำถามเหล่านี้:

  • จะดูรายการบริการที่กำลังทำงานอยู่ทั้งหมดได้อย่างไร?
  • อยากแสดงบริการทั้งหมด รวมถึงบริการที่ไม่ได้ใช้งาน จะทำอย่างไร?
  • อยากรู้ว่าบริการใดถูกตั้งค่าให้เริ่มอัตโนมัติบ้าง?
  • จะอ่านผลลัพธ์จากการแสดงรายการบริการอย่างไร?

บทความนี้เหมาะกับมือใหม่ Linux ด้วย มีตัวอย่างคำสั่งและผลลัพธ์ให้ดูอย่างละเอียด โปรดติดตามจนจบ

2. วิธีแสดงรายการบริการด้วย systemctl

ในการบริหารระบบ Linux การดูรายการบริการอย่างรวดเร็วเป็นสิ่งสำคัญ systemctl สามารถดูได้ทั้งบริการที่กำลังทำงานอยู่ บริการที่ไม่ได้ทำงาน และสถานะการตั้งค่าเริ่มต้นอัตโนมัติได้อย่างง่ายดาย

ส่วนนี้จะแนะนำ 3 วิธีหลักในการแสดงรายการบริการ:

  • รายการบริการที่กำลังทำงาน (Active)
  • รายการบริการทั้งหมด (รวมถึงที่ไม่ทำงาน)
  • รายการไฟล์ยูนิตของบริการ (รวมสถานะการตั้งค่า)

2.1 แสดงรายการบริการที่กำลังทำงานอยู่ (Active Services)

หากต้องการดูเฉพาะบริการที่ “กำลังทำงานอยู่” บนระบบ ให้ใช้คำสั่งนี้

systemctl list-units --type=service

คำสั่งนี้จะแสดงบริการที่ Active ในขณะนั้น รายการที่ได้จะมีหัวข้อต่อไปนี้:

ชื่อหัวข้อคำอธิบาย
UNITชื่อบริการ (เช่น ssh.service)
LOADไฟล์ยูนิตถูกโหลดหรือไม่
ACTIVEสถานะบริการ (active, inactive, failed เป็นต้น)
SUBสถานะย่อย (running, exited, dead เป็นต้น)
DESCRIPTIONคำอธิบายบริการ

ข้อมูลนี้ช่วยให้คุณตรวจสอบได้ว่า nginx กำลังรันอยู่หรือไม่ หรือมีอะไรที่ทำงานอยู่บ้าง

2.2 แสดงบริการทั้งหมด รวมบริการที่ไม่ Active

โดยปกติ list-units จะแสดงเฉพาะบริการที่ Active เท่านั้น ถ้าต้องการดูทั้งหมด ให้เพิ่มออปชัน --all

systemctl list-units --type=service --all

จะสามารถดูบริการที่ inactive หรือที่ไม่เคยถูกเรียกใช้งานมาก่อนได้ด้วย

หากต้องการกรองเฉพาะสถานะ ให้ใช้ --state= ตามด้วยสถานะที่ต้องการ เช่น

systemctl list-units --type=service --state=inactive

เช่นนี้จะเห็นเฉพาะบริการที่หยุดอยู่

2.3 ดูรายการไฟล์ยูนิตของบริการ

ถ้าต้องการรู้ว่า บริการใดถูกตั้งค่าให้เริ่มอัตโนมัติหรือไม่ ใช้คำสั่งนี้

systemctl list-unit-files --type=service

จะแสดงรายชื่อไฟล์ยูนิตของบริการ (ไฟล์กำหนดค่า) พร้อมสถานะการ Enable/Disable

ค่าของ STATEคำอธิบาย
enabledจะถูกเริ่มอัตโนมัติเมื่อบูตเครื่อง
disabledจะไม่ถูกเริ่ม ต้องสั่งเอง
staticขึ้นกับยูนิตอื่น ไม่สามารถ enable/disable ตรงๆ ได้
maskedถูกบล็อกไม่ให้เริ่มโดยเด็ดขาด (ป้องกันไว้)

ข้อมูลนี้ช่วยให้เห็นภาพรวมว่า บริการใดจะเริ่มกับระบบ หรือมีอันไหนถูก masked โดยไม่ตั้งใจหรือไม่

3. วิธีจัดการบริการด้วย systemctl เบื้องต้น

คำสั่ง systemctl นอกจากตรวจสอบสถานะแล้ว ยังใช้เริ่ม หยุด รีสตาร์ท และตั้งค่าการเริ่มอัตโนมัติของบริการได้ ส่วนนี้จะแนะนำวิธีใช้งานเบื้องต้นที่จำเป็นสำหรับผู้ดูแล Linux

การบริหารเซิร์ฟเวอร์หรือแก้ปัญหาต่างๆ จำเป็นต้องใช้คำสั่งเหล่านี้อย่างคล่องแคล่ว

3.1 สั่งเริ่มบริการ (Start Service)

หากต้องการสั่งเริ่มบริการ ให้ใช้ subcommand start ดังนี้

sudo systemctl start ชื่อบริการ

ตัวอย่าง ถ้าจะเริ่ม Apache (httpd):

sudo systemctl start httpd.service

บริการจะถูกเริ่มทันที ถ้าต้องการให้คงอยู่หลังรีบูต ให้ใช้ enable ร่วมด้วย (ดูด้านล่าง)

3.2 หยุดบริการ (Stop Service)

สั่งหยุดบริการ ใช้คำสั่งนี้

sudo systemctl stop ชื่อบริการ

ตัวอย่าง:

sudo systemctl stop sshd.service

บริการจะหยุดทำงานจนกว่าจะสั่ง start ใหม่

3.3 รีสตาร์ทบริการ (Restart Service)

หากต้องการรีสตาร์ทบริการ (เช่น หลังแก้ไขค่า config) ใช้คำสั่งนี้

sudo systemctl restart ชื่อบริการ

ตัวอย่าง:

sudo systemctl restart nginx.service

บริการจะหยุดแล้วเริ่มใหม่ทันที

3.4 ตรวจสอบสถานะของบริการ

ต้องการตรวจสอบสถานะโดยละเอียด ใช้ subcommand status

systemctl status ชื่อบริการ

ตัวอย่าง:

systemctl status mysql.service

จะแสดงสถานะ ปัจจุบัน, PID, และสรุป log ที่เกี่ยวข้อง เหมาะสำหรับการแก้ไขปัญหา

3.5 ตั้งค่าบริการให้เริ่มอัตโนมัติ (Enable Service)

หากต้องการให้บริการเริ่มอัตโนมัติเมื่อรีบูต ใช้ subcommand enable

sudo systemctl enable ชื่อบริการ

ตัวอย่าง:

sudo systemctl enable docker.service

ระบบจะเริ่มบริการนี้โดยอัตโนมัติในครั้งถัดไป

3.6 ปิดการเริ่มอัตโนมัติ (Disable Service)

หากไม่ต้องการให้บริการเริ่มอัตโนมัติ ให้ใช้ disable

sudo systemctl disable ชื่อบริการ

ตัวอย่าง:

sudo systemctl disable cups.service

บริการนี้จะไม่เริ่มกับการบูตเครื่องอีกต่อไป

3.7 ตรวจสอบสถานะการตั้งค่า Enable/Disable

ตรวจสอบบริการปัจจุบันว่าถูก enable หรือ disable ด้วย is-enabled

systemctl is-enabled ชื่อบริการ

ตัวอย่างผลลัพธ์:

enabled

ผลลัพธ์นี้จะบอกให้รู้ว่านโยบายการเริ่มต้นของบริการนั้นเป็นอย่างไร

4. systemctl: ตัวเลือกและเทคนิคที่ควรรู้

systemctl ไม่ได้มีแค่คำสั่งพื้นฐานเท่านั้น ยังรองรับการบริหารขั้นสูง เช่น การแสดง dependency และ option อื่นๆ ที่อำนวยความสะดวกมากขึ้น

การนำเทคนิคเหล่านี้ไปใช้ จะช่วยให้บริหาร Linux ได้มีประสิทธิภาพยิ่งขึ้น

4.1 แสดง Dependency ของบริการ

ใน Linux บริการหนึ่งอาจขึ้นกับยูนิตหรือบริการอื่น ๆ ต้องการดูความสัมพันธ์ ให้ใช้ list-dependencies

systemctl list-dependencies ชื่อบริการ

ตัวอย่าง:

systemctl list-dependencies nginx.service

คำสั่งนี้จะแสดงยูนิตที่เกี่ยวข้องเป็นลำดับชั้น เหมาะกับการวิเคราะห์ลำดับการเริ่มบริการ

4.2 แสดงเนื้อหาไฟล์ยูนิต

ถ้าต้องการดูค่ากำหนดละเอียดในไฟล์ยูนิต (ไฟล์ .service) ใช้คำสั่งนี้

systemctl cat ชื่อบริการ

ตัวอย่าง:

systemctl cat ssh.service

จะแสดง path และเนื้อหาของยูนิตที่โหลดใช้งานอยู่

4.3 โหลดยูนิตไฟล์ใหม่

หากแก้ไขยูนิตไฟล์ ต้องสั่ง daemon-reload เพื่อให้ systemctl โหลดค่าใหม่

sudo systemctl daemon-reexec

หรือโดยทั่วไปนิยมใช้:

sudo systemctl daemon-reload

หลังจากนั้น systemd จะใช้ค่าที่แก้ไขใหม่ หากรู้สึกว่าแก้แล้วไม่เปลี่ยนแปลง ให้ลองสั่ง reload นี้ก่อน

4.4 ดู log ของยูนิต (เพิ่มเติม)

แม้ systemctl เองจะไม่แสดง log ทั้งหมด แต่สามารถใช้ journalctl เพื่อดู log ของบริการได้

journalctl -u ชื่อบริการ

ตัวอย่าง:

journalctl -u docker.service

จะเห็น log error การเริ่มต้นหรือรีสตาร์ท ช่วยในการแก้ไขปัญหา

5. ปัญหาที่พบบ่อยและวิธีแก้ไข

การบริหารบริการด้วย systemctl อาจเจอปัญหาหรือ error ได้ ส่วนนี้จะอธิบายปัญหาที่พบบ่อยและแนวทางแก้ไข

เช่น “บริการไม่เริ่ม” หรือ “ไม่รู้สาเหตุที่หยุดทำงาน” ให้ดูหัวข้อนี้ก่อน จะช่วยให้แก้ปัญหาได้รวดเร็ว

5.1 กรณีบริการไม่เริ่ม ต้องตรวจสอบอะไรบ้าง?

พยายามเริ่มบริการแต่เจอ error เช่น

Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.

ควรตรวจสอบตามลำดับนี้:

  1. ดู status ของบริการ
   systemctl status ชื่อบริการ
  1. ตรวจสอบ error log
   journalctl -xe
  1. รีโหลดยูนิตไฟล์
    ถ้าเพิ่งแก้ไฟล์ยูนิต ให้สั่ง reload
   sudo systemctl daemon-reload
  1. เช็คการชนกันของพอร์ต
    ตรวจสอบว่ามีพอร์ตเดียวกันถูกใช้โดยโปรเซสอื่นหรือไม่
   sudo netstat -tulnp | grep หมายเลขพอร์ต

5.2 วิธีอ่าน error message จากคำสั่ง status

เมื่อใช้ systemctl status จะแสดงทั้งสถานะและ log ล่าสุด เช่น

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since Fri 2025-04-18 12:00:00 JST; 5s ago
  Process: 12345 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)

จะเห็น “Active: failed” หรือ “status=1/FAILURE” ช่วยระบุสาเหตุเบื้องต้นของปัญหา

จากบรรทัด Loaded จะเห็น path ของยูนิตไฟล์ด้วย ทำให้ง่ายต่อการตรวจสอบ

5.3 บริการหยุดเองโดยอัตโนมัติ

ถ้าบริการเริ่มแต่หยุดเอง สาเหตุหลักๆ ได้แก่:

  • ไฟล์ config มีข้อผิดพลาด
  • พอร์ตชนกับบริการอื่น
  • ไม่มีไฟล์หรือไดเรกทอรีที่จำเป็น
  • ขาดสิทธิ์ในการรัน

แนวทางแก้ไขเช่น:

  • ตรวจสอบ config ด้วย nginx -t หรือ apachectl configtest
  • ดู log รายละเอียดด้วย journalctl -u ชื่อบริการ
  • ตรวจสอบว่ามีไดเรกทอรี (เช่น /var/run/xxx) ที่ต้องใช้หรือไม่ ถ้าไม่มีให้สร้าง

5.4 ไม่สามารถ start บริการที่อยู่ในสถานะ masked

หากสั่ง systemctl start แล้วขึ้น error ว่า:

Failed to start example.service: Unit example.service is masked.

แปลว่าบริการนั้นถูก mask (ปิดแบบสมบูรณ์) ต้องใช้ unmask ปลดล็อกก่อน

sudo systemctl unmask ชื่อบริการ

แล้วจึงสั่ง start ได้ตามปกติ

6. สรุป

การจัดการบริการใน Linux เป็นงานสำคัญประจำวัน โดยใช้คำสั่ง systemctl เป็นเครื่องมือหลักในการแสดงรายการและควบคุมบริการต่างๆ

บทความนี้เน้น “systemctl แสดงรายการ” โดยอธิบายจุดสำคัญต่าง ๆ ดังนี้

สรุปสิ่งที่ systemctl ทำได้

  • ตรวจสอบรายการบริการ
  • แสดงบริการที่กำลังรัน (list-units --type=service)
  • ดูทั้งหมด (รวม inactive) (--all หรือ --state= option)
  • ดูไฟล์ยูนิตและสถานะการ Enable/Disable (list-unit-files)
  • ควบคุมบริการพื้นฐาน
  • เริ่ม/หยุด/รีสตาร์ท/เช็คสถานะ (start/stop/restart/status)
  • ตั้งค่าเริ่มอัตโนมัติ (enable/disable/is-enabled)
  • ขั้นสูงและแก้ปัญหา
  • ดู dependency, ดูยูนิตไฟล์, reload การตั้งค่า
  • วิเคราะห์ error จาก log และสถานะ

Best Practice ในการจัดการบริการ

  • ตรวจสอบสถานะก่อนสั่งงาน (เช็ค status เสมอ)
  • ตรวจสอบการ enable/disable (ด้วย is-enabled)
  • สั่ง daemon-reload หลังแก้ไขค่าต่างๆ
  • เช็ค log ด้วย journalctl เมื่อมีปัญหา

การตรวจสอบเป็นประจำเหล่านี้จะช่วยให้บริการมีเสถียรภาพและแก้ปัญหาได้รวดเร็ว

หัวข้อแนะนำสำหรับศึกษาต่อ

ถ้าอยากศึกษาต่อ แนะนำหัวข้อต่อไปนี้:

  • systemd target (ต่างจาก runlevel อย่างไร)
  • การตั้ง schedule อัตโนมัติด้วย systemd-timer
  • การสร้างและจัดวางยูนิตไฟล์เอง

7. คำถามที่พบบ่อย (FAQ)

รวบรวมคำถามยอดนิยมเกี่ยวกับ systemctl และการแสดงรายการบริการ เหมาะทั้งมือใหม่และผู้ที่ต้องการทบทวน

Q1. คำสั่ง systemctl กับ service ต่างกันอย่างไร?

A1.
systemctl เป็นคำสั่งสำหรับจัดการบริการบนระบบที่ใช้ systemd ซึ่งเป็นมาตรฐานบน Linux รุ่นใหม่ ๆ (Ubuntu, CentOS, Fedora ฯลฯ) ส่วน service เป็นของระบบเก่า (SysVinit) ปัจจุบัน systemd แนะนำให้ใช้ systemctl เป็นหลัก

Q2. list-units กับ list-unit-files ต่างกันอย่างไร?

A2.

  • list-units แสดงยูนิตที่ถูกโหลด (บริการที่กำลังรันหรือเคยถูกเรียกใช้งาน)
  • list-unit-files แสดงไฟล์ยูนิตทั้งหมดและสถานะ enable/disable
    สรุปคือ ต่างกันที่ “สิ่งที่กำลังทำงาน” กับ “สิ่งที่ตั้งค่าไว้”

Q3. บริการที่เป็น static สามารถ start ได้ไหม?

A3.
บริการ static สามารถ start ได้เอง แต่ไม่สามารถ enable ให้ start อัตโนมัติได้
เนื่องจาก static ขึ้นกับยูนิตอื่นจะเป็นผู้เรียกใช้งาน

Q4. บริการที่ masked อยู่ start ไม่ได้ ต้องทำอย่างไร?

A4.
masked คือบริการที่ถูกบล็อกการเริ่มต้นอย่างสมบูรณ์ ต้องสั่ง unmask ก่อน:

sudo systemctl unmask ชื่อบริการ

จากนั้นจึง start ได้ตามปกติ

Q5. สามารถดูสถานะบริการแบบ GUI ได้ไหม?

A5.
บาง Linux เช่น Ubuntu มีเครื่องมืออย่าง gnome-system-monitor, KSysGuard, Cockpit ให้ดูสถานะบริการแบบกราฟิก
แต่ถ้าต้องการจัดการหรือปรับแต่งอย่างละเอียด แนะนำใช้ systemctl จะดีที่สุด

Q6. ถ้าอยากสร้างไฟล์ยูนิตเอง ควรวางไว้ที่ไหน?

A6.
โดยทั่วไปให้วางไฟล์ยูนิตไว้ที่ /etc/systemd/system/ หลังจากแก้ไขแล้วต้องสั่ง:

sudo systemctl daemon-reload

จากนั้นสามารถ start/enable ได้ตามปกติ

年収訴求