วิธีการใช้ ps, kill และ nice ในกระบวนการในการจัดการของ Linux

เซิร์ฟเวอร์ Linux เช่นเดียวกับคอมพิวเตอร์ในปัจจุบันซึ่งจะรันแอปพลิเคชันหลายตัวพร้อมกัน ซึ่งแอปพลิเคชันเหล่านี้จะถูกเรียกและจัดการเป็นกระบวนการ  (process) แยกกันแต่ละตัว แม้ว่า Linux จะจัดการงานเบื้องหลังระดับต่ำต่าง ๆ ของกระบวนการ เช่น startup, shutdown และ การจัดสรรหน่วยความจำ เป็นต้น แต่เรายังคงต้องมีวิธีการโต้ตอบกับระบบปฏิบัติการเพื่อจัดการกับกระบวนการเหล่านี้ในระดับที่สูงขึ้น ในคู่มือนี้ คุณจะได้เรียนรู้แนวคิดพื้นฐานบางประการเกี่ยวกับการจัดการกระบวนการ Linux ผ่านระบบปฏิบัติการของ Ubuntu 20.04 

ขั้นตอนที่ 1 – วิธีดูกระบวนการที่กำลังทำงานบน Linux

คุณสามารถดูกระบวนการทั้งหมดที่ทำงานบนเซิร์ฟเวอร์ของคุณได้โดยใช้คำสั่ง top

top

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

ผลลัพธ์อื่นที่แสดงเพิ่มเติมจะแสดงกระบวนการที่กำลังทำงานและสถิติการใช้งานของระบบอื่น ๆ  คำสั่ง top จะจัดเรียงกระบวนการตามการใช้งาน CPU โดยอัตโนมัติ ดังนั้นคุณจะเห็นกระบวนการที่ใช้ทรัพยากรมากที่สุดก่อน และคำสั่ง top จะทำงานต่อไปใน shell จนกว่าเราจะหยุดด้วยการกด Ctrl+C เพื่อออกจากกระบวนการที่กำลังทำงานอยู่ การทำเช่นนี้จะส่งสัญญาณ kill เพื่อสั่งให้กระบวนการหยุดทำงานอย่างถูกต้องหากเป็นไปได้ มีเวอร์ชันที่ปรับปรุงของ top ชื่อว่า htop ซึ่งมีให้ใช้งานได้เกือบทุกแพ็กเกจ (package repositories) บน Ubuntu 20.04 ซึ่งสามารถติดตั้งได้ด้วยคำสั่ง apt

sudo apt install htop

หลังจากนั้นคำสั่ง htop จะพร้อมใช้งาน

htop

htop ช่วยให้มองเห็นเธรด CPU หลายเธรดได้ดีขึ้น รับรู้ถึงการรองรับสีใหม่ ๆ ได้ดีขึ้น และมีตัวเลือกการเรียงลำดับมากขึ้น รวมถึงคุณสมบัติอื่นๆ ซึ่งแตกต่างจาก top ตรงที่ htop ไม่ได้ติดตั้งไว้ตามค่าเริ่มต้นเสมอ แต่สามารถพิจารณาได้ว่ามาแทนที่ได้ทันที คุณสามารถออกจาก htop ได้โดยกด Ctrl+C เช่นเดียวกับ top

ขั้นตอนที่ 2 – วิธีใช้ ps เพื่อแสดงรายการกระบวนการ

top และ htop เป็นเครื่องมือที่ให้ส่วนต่อประสานแบบแดชบอร์ดเพื่อดูข้อมูลของกระบวนการที่กำลังทำงาน ซึ่งคล้ายกับตัวจัดการงานในระบบกราฟิก (graphical task manager) ส่วนต่อประสานแบบแดชบอร์ดสามารถแสดงภาพรวมได้ดี แต่โดยทั่วไปจะไม่ให้ผลลัพธ์ที่นำไปใช้ได้โดยตรง สำหรับการนี้ Linux มีคำสั่งมาตรฐานอีกคำสั่งหนึ่งเรียกว่า ps ที่ใช้สำหรับสอบถามกระบวนการที่กำลังทำงาน

เมื่อรันคำสั่ง ps โดยไม่ระบุอาร์กิวเมนต์ใด ๆ จะให้ข้อมูลเพียงเล็กน้อย

ps

ผลลัพธ์นี้แสดงกระบวนการทั้งหมดที่เกี่ยวข้องกับ session ผู้ใช้ ณ ปัจจุบัน ซึ่งจะสมเหตุสมผลหากคุณกำลังรันเฉพาะ shell bash และคำสั่ง ps ภายในเทอร์มินัลนี้เท่านั้น

หากต้องการดูภาพรวมของกระบวนการบนระบบนี้ให้สมบูรณ์ยิ่งขึ้น คุณสามารถรัน ps aux

ps aux

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

สำหรับการใช้ ps aux โดยใช้ grep ด้วยเพื่อส่งคืนชื่อของกระบวนการเฉพาะ ซึ่งมีประโยชน์หากคุณเชื่อว่ากระบวนการขัดข้อง หรือหากคุณต้องการหยุดกระบวนการด้วยเหตุผลบางประการ

ps aux | grep bash

การดำเนินการนี้จะส่งคืนทั้งกระบวนการ grep ที่คุณเพิ่งรันและ shell bash ที่กำลังรันอยู่ในปัจจุบัน นอกจากนี้ยังส่งคืนหน่วยความจำและการใช้งาน CPU ทั้งหมด ระยะเวลาที่รัน และ ID กระบวนการในเอาต์พุตที่เน้นไว้ด้านบน ในระบบ Linux และ Unix แต่ละกระบวนการจะได้รับการกำหนด ID กระบวนการหรือ PID 

วิธีที่รวดเร็วในการรับ PID ของกระบวนการคือใช้คำสั่ง pgrep

pgrep bash

กระบวนการแรกที่เกิดขึ้นตอน boot เรียกว่า init จะได้รับ PID เป็น “1”

pgrep init

กระบวนการนี้เป็นตัวที่รับผิดชอบในการสร้างกระบวนการอื่นทั้งหมดในระบบ กระบวนการที่เกิดขึ้นภายหลังจะได้รับหมายเลข PID ที่ใหญ่ขึ้น กระบวนการแม่ (Parent process) คือกระบวนการที่สร้างกระบวนการลูกขึ้นมา โดยกระบวนการแม่จะมีรหัส PPID ซึ่งคุณสามารถเห็นได้ในส่วนหัวของคอลัมน์ในแอปพลิเคชันจัดการกระบวนการหลาย ๆ ตัว เช่น top, htop และ ps

เมื่อผู้ใช้ต้องการสื่อสารกับระบบปฏิบัติการเกี่ยวกับกระบวนการต่าง ๆ จำเป็นต้องแปลชื่อกระบวนการและ PID (Process ID) ในระหว่างการทำงาน นี่คือเหตุผลที่เครื่องมือเหล่านี้จะแสดง PID ในผลลัพธ์เสมอ ในส่วนถัดไป คุณจะได้เรียนรู้วิธีใช้ PID เพื่อส่งสัญญาณหยุด, เรียกคืน หรือสัญญาณอื่น ๆ ไปยังกระบวนการที่กำลังทำงาน

ขั้นตอนที่ 3 – วิธีส่งสัญญาณไปยังกระบวนการใน Linux

กระบวนการทั้งหมดใน Linux ตอบสนองต่อสัญญาณ สัญญาณเป็นวิธีระดับระบบปฏิบัติการในการบอกโปรแกรมให้ยุติหรือปรับเปลี่ยนพฤติกรรม

วิธีที่พบบ่อยที่สุดในการส่งสัญญาณไปยังโปรแกรมคือการใช้คำสั่ง kill

kill PID_of_target_process

การดำเนินการนี้จะส่งสัญญาณ TERM ไปยังกระบวนการ สัญญาณ TERM จะแจ้งให้กระบวนการยุติการทำงาน การดำเนินการนี้จะทำให้โปรแกรมสามารถดำเนินการล้างข้อมูลและออกจากระบบได้อย่างราบรื่น

หากโปรแกรมทำงานผิดปกติและไม่ออกเมื่อได้รับสัญญาณ TERM คุณสามารถส่งสัญญาณ KILL เพื่อเร่งกระบวนการให้ทำงานต่อ

kill -KILL PID_of_target_process

นี่คือสัญญาณพิเศษที่ไม่ได้ถูกส่งไปยังโปรแกรมโดยตรง แต่จะถูกส่งไปยังเคอร์เนลของระบบปฏิบัติการ ซึ่งจะทำการปิดกระบวนการนั้นแทน สัญญาณนี้ใช้เมื่อต้องการข้ามโปรแกรมที่ไม่ตอบสนองต่อสัญญาณที่ส่งไปถึง แต่ละสัญญาณจะมีหมายเลขกำกับ ซึ่งสามารถใช้แทนชื่อได้ เช่น คุณสามารถส่งสัญญาณ “-15” แทน “-TERM” หรือ “-9” แทน “-KILL” ได้

สัญญาณไม่ได้ใช้แค่สำหรับปิดโปรแกรมเท่านั้น ยังสามารถใช้เพื่อทำงานอื่นได้ด้วย ตัวอย่างเช่น กระบวนการหลายตัวที่ออกแบบมาให้ทำงานในพื้นหลังตลอดเวลา (ที่บางครั้งเรียกว่า “daemons”) จะรีสตาร์ทอัตโนมัติเมื่อได้รับสัญญาณ HUP หรือสัญญาณตัดการเชื่อมต่อ (hang-up) เซิร์ฟเวอร์เว็บ Apache มักจะทำงานในลักษณะนี้

sudo kill -HUP pid_of_apache

คำสั่งด้านบนจะทำให้ Apache โหลดไฟล์การกำหนดค่าใหม่และกลับมาให้บริการเนื้อหาอีกครั้ง

คุณสามารถแสดงรายการสัญญาณทั้งหมดที่สามารถส่งได้โดยใช้แฟล็ก -l โดยใช้ kill

kill -l

แม้ว่าวิธีการส่งสัญญาณแบบทั่วไปคือการใช้ PID แต่ก็มีวิธีการอื่นๆ ที่ใช้ชื่อกระบวนการปกติได้เช่นกัน
คำสั่ง pkill ทำงานในลักษณะเดียวกันกับ kill แต่ทำงานโดยใช้ชื่อกระบวนการแทน

pkill -9 ping

คำสั่งด้านบนนี้เทียบเท่ากับ

kill -9 `pgrep ping`

หากคุณต้องการส่งสัญญาณไปยังทุกกระบวนการ คุณสามารถใช้คำสั่ง killall ได้

killall firefox

คำสั่งด้านบนจะส่งสัญญาณ TERM ไปยังทุกอินสแตนซ์ของ Firefox ที่ทำงานบนคอมพิวเตอร์

ขั้นตอนที่ 4 – วิธีปรับลำดับความสำคัญของกระบวนการ

ในสภาพแวดล้อมของเซิร์ฟเวอร์ บางครั้งคุณอาจต้องการปรับลำดับความสำคัญของกระบวนการต่าง ๆ กระบวนการบางอย่างอาจถือว่ามีความสำคัญสูงต่อการทำงานของคุณ ขณะที่กระบวนการอื่นสามารถรันได้เมื่อมีทรัพยากรเหลือใช้

Linux ควบคุมลำดับความสำคัญของกระบวนการผ่านค่าที่เรียกว่า “niceness” งานที่มีลำดับความสำคัญสูงจะถูกมองว่า less nice เพราะพวกมันไม่ค่อยแบ่งปันทรัพยากร ส่วนกระบวนการที่มีลำดับความสำคัญต่ำจะถือว่า nice เพราะใช้ทรัพยากรเพียงเล็กน้อยเท่านั้น

เมื่อคุณใช้คำสั่ง top ในตอนต้นของบทความ คุณจะเห็นคอลัมน์ที่มีหัวข้อ “NI” ซึ่งแสดงค่า nice ของกระบวนการ ค่า nice สามารถอยู่ระหว่าง -19/-20 (ลำดับความสำคัญสูงสุด) และ 19/20 (ลำดับความสำคัญต่ำสุด) ขึ้นอยู่กับระบบ หากต้องการเรียกใช้โปรแกรมที่มีค่า nice ที่กำหนด คุณสามารถใช้คำสั่ง nice ได้

nice -n 15 command_to_execute

วิธีนี้ใช้ได้เฉพาะตอนเริ่มโปรแกรมใหม่เท่านั้น

หากต้องการเปลี่ยนค่า nice ของโปรแกรมที่กำลังดำเนินการอยู่ ให้ใช้เครื่องมือที่เรียกว่า renice

renice 0 PID_to_prioritize

Was this article helpful?

Related Articles