หนึ่งในเครื่องมือที่ทรงพลังและมีประโยชน์ที่สุดสำหรับผู้ใช้ Linux โดยเฉพาะ distro สมัยใหม่อย่าง Ubuntu คือ คำสั่ง systemctlยูทิลิตี้บรรทัดคำสั่งนี้มักใช้สำหรับโต้ตอบกับ systemd ซึ่งเป็นตัวจัดการระบบและบริการ
ผ่านคำสั่งนี้ คุณสามารถจัดการบริการของระบบ ดูสถานะ เริ่มหรือหยุดการทำงาน รวมถึงเปิดหรือปิดใช้งานเมื่อบูตระบบได้ มีประโยชน์มากใช่ไหม? แต่ถ้าคำสั่ง systemctl ไม่ถูกพบหรือไม่เป็นที่รู้จัก คุณจะเจอกับ «sudo:systemctl: command not found» ข้อผิดพลาด
ดังนั้น เรามาพูดคุยเกี่ยวกับความหมายของข้อผิดพลาด "systemctl: command not found" เหตุผลที่หลากหลายว่าทำไมคุณถึงเผชิญกับข้อผิดพลาดนี้ และวิธีการแก้ไขข้อผิดพลาดนี้
systemctl: command not found หมายความว่าอะไร?
ในแง่ง่ายๆ ข้อผิดพลาด "systemctl: command not found" หมายความว่าเครื่องมือสายคำสั่ง systemctl ไม่พร้อมใช้งานหรือไม่สามารถเข้าถึงได้ในสภาพแวดล้อมปัจจุบัน สิ่งนี้อาจเกิดจากหลายสาเหตุ ซึ่งทั้งหมดกลับมาที่ว่าสภาพแวดล้อมเป็นสภาพแวดล้อมที่ไม่ใช่ระบบจริง หรือแพ็คเกจ systemd ไม่ได้ถูกติดตั้งบนระบบ
โดยพื้นฐานแล้ว อาจเป็นเพราะแพ็กเกจ systemd ยังไม่ได้ติดตั้ง หรือ distro หรือเวอร์ชันของ Linux ที่คุณใช้งานไม่ได้ใช้ systemd แต่ใช้ระบบจัดการ service รุ่นเก่าอย่าง init.d แทน อีกกรณีหนึ่งที่เป็นไปได้คือ PATH environment variable ไม่ได้รวม directory ที่เก็บ systemctl เอาไว้ ทำให้ shell ของคุณหาคำสั่งนั้นไม่พบ
ตอนนี้เมื่อคุณทราบแล้วว่าอะไรอาจเป็นสาเหตุของข้อผิดพลาด "systemctl: command not found" ในระบบของคุณ มาดูวิธีตรวจสอบต้นตอของปัญหาและแนวทางแก้ไขกัน
แก้ไขข้อผิดพลาด systemctl: Command Not Found
ในขั้นตอนต่อไปนี้ เราจะตรวจสอบว่าระบบของคุณมี systemd ติดตั้งอยู่และใช้งาน systemctl หรือไม่ รวมถึงตรวจสอบ path ของ systemctl ด้วย เมื่อระบุปัญหาได้แล้ว เราจะดำเนินการแก้ไข error ตามขั้นตอนที่เหมาะสม
1. ตรวจสอบว่าระบบของคุณใช้ systemd หรือไม่
เนื่องจาก Ubuntu คำสั่ง systemctl จะใช้งานได้ก็ต่อเมื่อติดตั้งแพ็กเกจ systemd ไว้แล้ว ให้เราตรวจสอบก่อนว่าระบบของคุณใช้ systemd หรือไม่ ด้วยคำสั่งต่อไปนี้:
ps -p 1 -o comm=
หรือตรวจสอบเวอร์ชันของ systemd ด้วยคำสั่งต่อไปนี้:
systemd --version
หากผลลัพธ์แสดงว่า systemd แสดงว่าระบบของคุณใช้ systemd เป็น init system และควรมี Ubuntu systemctl ติดตั้งอยู่แล้ว แต่ถ้าผลลัพธ์แสดงว่า init หรือ process manager ตัวอื่น หมายความว่าระบบกำลังใช้ initialization system แบบอื่น และ systemctl จะไม่สามารถใช้งานได้จนกว่าคุณจะย้ายไปใช้ systemd
หากระบบของคุณใช้ระบบ init แบบเก่าอย่าง Upstart หรือ SysVinit และต้องการเปลี่ยนมาใช้ systemd เพื่อใช้งาน systemctl ให้ทำตามขั้นตอนต่อไปนี้:
1. ติดตั้ง systemctl โดยติดตั้ง systemd ด้วยคำสั่งต่อไปนี้:
sudo apt install systemd-sysv
2. รีบูตระบบด้วยคำสั่งนี้:
sudo reboot
3. ตรวจสอบว่าระบบของคุณใช้งาน systemd แล้ว:
ps -p 1 -o comm=
ผลลัพธ์ควรเป็น systemd แล้วตอนนี้
2. ตรวจสอบว่าติดตั้ง systemd อย่างถูกต้อง
ในสถานการณ์ปกติ หาก systemd ติดตั้งอยู่และทำงานเป็น init system คำสั่ง systemctl ควรใช้งานได้ถูกต้อง หากไม่เป็นเช่นนั้น แสดงว่าแพ็กเกจ systemd อาจหายไปหรือติดตั้งไม่ถูกต้อง
โปรดทราบว่าหากคุณใช้ Ubuntu เวอร์ชันขั้นต่ำ เช่น คอนเทนเนอร์ Docker หรืออินสแตนซ์บนคลาวด์ อาจไม่มีการติดตั้ง systemd มาให้โดยค่าเริ่มต้น หากต้องการติดตั้ง systemctl ผ่านการติดตั้ง systemd ให้รันคำสั่งต่อไปนี้:
sudo apt update sudo apt install systemd
เมื่อติดตั้งเสร็จแล้ว ให้ตรวจสอบว่าสามารถใช้คำสั่ง systemctl ได้หรือไม่
3. ตรวจสอบ PATH ของ systemctl
ปัญหาที่พบบ่อยอีกอย่างของข้อผิดพลาด systemctl not found คือ systemctl อาจติดตั้งอยู่แล้ว แต่ไม่ได้อยู่ใน PATH ของระบบ หากต้องการตรวจสอบว่า systemd binaries มีอยู่ในไดเรกทอรีทั่วไปที่มักจะวางไว้ เช่น /bin, /usr/bin หรือ /usr/local/bin ให้ใช้คำสั่งต่อไปนี้:
which systemctl
หาก systemctl ปรากฏอยู่ในไดเรกทอรีใดไดเรกทอรีหนึ่งใน PATH ของคุณ คุณจะเห็นผลลัพธ์ในลักษณะนี้:
/usr/bin/systemctl
หาก systemctl ไม่พบในไดเรกทอรีใดเลยใน PATH คำสั่ง which จะไม่คืนค่าใดๆ
อย่างไรก็ตาม systemctl อาจยังใช้งานไม่ได้แม้จะพบในไดเรกทอรีของคุณ สาเหตุคือ systemctl อาจอยู่ในไดเรกทอรีที่ไม่ได้รวมอยู่ใน PATH หากเป็นเช่นนั้น ให้ตรวจสอบว่าไดเรกทอรีที่ systemctl อยู่นั้นเป็นส่วนหนึ่งของระบบหรือไม่ด้วยคำสั่งนี้:
echo $PATH
ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ขั้นตอนต่อไปคือตรวจสอบว่าไดเรกทอรีที่ systemctl อยู่ (ซึ่งได้จากคำสั่ง which) ปรากฏอยู่ในรายการที่แสดงจากคำสั่ง echo $PATH หรือไม่
หากไดเรกทอรีของ systemctl ไม่ปรากฏในผลลัพธ์ของ echo $PATH คุณต้องเพิ่มไดเรกทอรีนั้นเข้าไปใน PATH variable โดยใช้คำสั่งต่อไปนี้:
สำหรับ ผู้ใช้ Bash shellเปิดไฟล์ ~/.bashrc ด้วยโปรแกรมแก้ไขข้อความ:
nano ~/.bashrc
เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์:
export PATH=$PATH:/usr/bin
ในตัวอย่างนี้ /usr/bin คือไดเรกทอรีทั่วไปที่ systemctl มักจะอยู่
บันทึกและปิดไฟล์โดยกด CTRL + X จากนั้นกด Y เพื่อยืนยัน แล้วกด Enter เพื่อบันทึก
สำหรับ ผู้ใช้ Zshเปิดไฟล์ ~/.zshrc ด้วยโปรแกรมแก้ไขข้อความ:
nano ~/.zshrc
เพิ่มบรรทัดต่อไปนี้ที่ท้ายไฟล์:
export PATH=$PATH:/usr/bin
ในตัวอย่างนี้ /usr/bin คือไดเรกทอรีทั่วไปที่ systemctl มักจะอยู่
บันทึกและปิดไฟล์โดยกด CTRL + X จากนั้นกด Y เพื่อยืนยัน แล้วกด Enter เพื่อบันทึก
เมื่อทำขั้นตอนข้างต้นเสร็จแล้ว ให้ใช้คำสั่ง echo $PATH เพื่อยืนยันว่าไดเรกทอรีของ systemctl ถูกเพิ่มเข้าไปใน PATH แล้วหรือยัง หลังจากนี้คุณควรสามารถรัน systemctl ได้โดยไม่พบข้อผิดพลาด "systemctl: command not found" อีกต่อไป
4. การติดตั้ง systemd ใหม่
หากวิธีแก้ไขก่อนหน้านี้ยังไม่ช่วยได้และคุณยังพบข้อผิดพลาด command not found อยู่ การติดตั้ง systemd ใหม่ทั้งหมดอาจช่วยแก้ปัญหาได้ ให้รันคำสั่งต่อไปนี้:
sudo apt purge systemd sudo apt install systemd
จากนั้นรีบูตระบบด้วยคำสั่งนี้:
sudo reboot
ตรวจสอบว่า systemctl ทำงานได้ปกติหรือไม่
5. ตรวจสอบการตั้งค่า systemd ให้ถูกต้อง
บางครั้งปัญหาอาจเกิดจากการติดตั้ง systemd ที่ตั้งค่าไว้ไม่ถูกต้อง ซึ่งทำให้เกิดข้อผิดพลาด "systemctl: command not found" วิธีแก้ไขคือรันคำสั่งต่อไปนี้เพียงคำสั่งเดียว:
sudo dpkg-reconfigure systemd
6. Windows Subsystem for Linux (WSL) ที่ล้าสมัย
หากคุณกำลังใช้งาน Ubuntu บน WSL (Windows Subsystem for Linux) ควรทราบว่า WSL เวอร์ชันเก่า เช่น WSL 1 ไม่รองรับ systemctl โดยตรง ดังนั้นไม่ว่าคุณจะลองวิธีแก้ไขใดจากข้างต้น คุณก็จะไม่สามารถรัน systemctl ได้
หากต้องการใช้งานฟังก์ชันของ systemctl คุณต้องอัปเกรดเป็น WSL 2 ซึ่งรองรับ systemd ได้ดีกว่า หากไม่แน่ใจว่าใช้ WSL อยู่หรือไม่ ให้ตรวจสอบด้วยคำสั่งนี้:
uname -a
หากผลลัพธ์แสดงคำว่า WSL นั่นคือสาเหตุที่คุณเห็นข้อผิดพลาด "systemctl: command not found"
7. ใช้ sudo service แทน systemctl
หากคุณพบข้อผิดพลาด "systemctl: command not found" เพราะระบบของคุณไม่ได้ใช้ systemd คุณสามารถใช้คำสั่ง sudo service เพื่อจัดการ service แทนได้ คำสั่งนี้ทำงานร่วมกับระบบ init แบบเก่า เช่น SysVinit หรือ Upstart และมีประโยชน์สำหรับระบบ Ubuntu ที่ใช้ init script แทน systemd
ตัวอย่างเช่น หากต้องการสตาร์ท service ให้รัน:
sudo service <service_name> start
สรุป
systemd และคำสั่ง systemctl ได้เข้ามาแทนที่ระบบ init รุ่นเก่าอย่าง SysVinit และ Upstart ไปเป็นที่เรียบร้อยแล้ว แม้ว่า systemd จะไม่ถูกใจทุกคนเนื่องจากการออกแบบแบบ monolithic และแนวทางที่ไม่สอดคล้องกับปรัชญา Unix แต่ก็ยังถือเป็นตัวเลือกหลักที่นิยมใช้กันมากที่สุด หวังว่าบทความนี้จะช่วยให้คุณแก้ปัญหา systemctl: command not found ได้ เพราะหากใช้ command-line utility ของ systemd ไม่ได้ ก็จะส่งผลให้การจัดการระบบทำได้อย่างจำกัดมาก
คำถามที่พบบ่อย
systemctl คืออะไร และข้อผิดพลาด systemctl: Command Not Found หมายความว่าอะไร?
systemctl เป็นเครื่องมือ command-line สำหรับจัดการ service บนระบบ Linux ที่ใช้ systemd เช่น Ubuntu ข้อผิดพลาด "systemctl: command not found" เกิดขึ้นเมื่อเครื่องมือนี้ไม่พร้อมใช้งานหรือเข้าถึงไม่ได้ ซึ่งโดยทั่วไปมักเกิดจากระบบไม่ได้ใช้ systemd หรือยังไม่ได้ติดตั้ง package ของ systemd
systemctl ใช้ได้กับ Ubuntu ทุกเวอร์ชันหรือไม่?
ไม่ใช่ทุกเวอร์ชัน systemctl เป็นส่วนหนึ่งของระบบ init ชื่อ systemd ซึ่งเป็นค่าเริ่มต้นใน Ubuntu เวอร์ชันใหม่ส่วนใหญ่ (ตั้งแต่เวอร์ชัน 15.04 เป็นต้นมา) เวอร์ชันเก่าหรือการติดตั้งแบบ minimal บางรูปแบบอาจใช้ระบบ init ทางเลือกอย่าง SysVinit หรือ Upstart แทน