ค้นหาเว็บไซต์

ทั้งหมดที่คุณต้องการรู้เกี่ยวกับกระบวนการใน Linux [คู่มือที่ครอบคลุม]


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

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

ประเภทของกระบวนการ

โดยพื้นฐานแล้วกระบวนการใน Linux มีอยู่ 2 ประเภท:

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

เดมอนคืออะไร

กระบวนการเหล่านี้เป็นกระบวนการพื้นหลังประเภทพิเศษที่เริ่มต้นเมื่อเริ่มต้นระบบและทำงานต่อไปเป็นบริการตลอดไป พวกเขาไม่ตาย พวกเขาจะเริ่มต้นเป็นงานระบบ (ทำงานเป็นบริการ) ตามธรรมชาติ อย่างไรก็ตาม ผู้ใช้สามารถควบคุมได้ผ่านกระบวนการเริ่มต้น

การสร้างกระบวนการใน Linux

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

มีสองวิธีทั่วไปที่ใช้ในการสร้างกระบวนการใหม่ใน Linux:

  • การใช้ฟังก์ชัน System() – วิธีการนี้ค่อนข้างง่าย แต่ก็ไม่มีประสิทธิภาพและมีความเสี่ยงด้านความปลอดภัยอย่างมาก
  • การใช้ฟังก์ชัน fork() และ exec() – เทคนิคนี้เป็นเทคนิคขั้นสูงเล็กน้อย แต่ให้ความยืดหยุ่น ความเร็ว และความปลอดภัยที่มากกว่า

Linux ระบุกระบวนการอย่างไร?

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

และโปรแกรมจะถูกระบุด้วยรหัสกระบวนการ (PID) เช่นเดียวกับรหัสกระบวนการหลัก (PPID) ดังนั้นกระบวนการจึงสามารถจัดหมวดหมู่เพิ่มเติมได้เป็น:

  • กระบวนการหลัก – เป็นกระบวนการที่สร้างกระบวนการอื่นในระหว่างรันไทม์
  • กระบวนการย่อย – กระบวนการเหล่านี้สร้างขึ้นโดยกระบวนการอื่นในระหว่างรันไทม์

กระบวนการเริ่มต้น

กระบวนการ เริ่มต้น เป็นกระบวนการแม่ (พาเรนต์) ของกระบวนการทั้งหมดบนระบบ เป็นโปรแกรมแรกที่จะดำเนินการเมื่อระบบ Linux เริ่มทำงาน มันจัดการกระบวนการอื่น ๆ ทั้งหมดในระบบ มันเริ่มต้นจากเคอร์เนลเอง ดังนั้นโดยหลักการแล้วมันไม่มีกระบวนการหลัก

กระบวนการเริ่มต้นจะมีรหัสกระบวนการเป็น 1 เสมอ มันทำหน้าที่เป็นพ่อแม่บุญธรรมสำหรับกระบวนการกำพร้าทั้งหมด

คุณสามารถใช้ คำสั่ง pidof เพื่อค้นหา ID ของกระบวนการ:

pidof systemd
pidof top
pidof httpd

หากต้องการค้นหา ID กระบวนการและ ID กระบวนการหลักของเชลล์ปัจจุบัน ให้รัน:

echo $$
echo $PPID

การเริ่มต้นกระบวนการใน Linux

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

cloudcmd

งานพื้นหลัง Linux

หากต้องการเริ่มกระบวนการในเบื้องหลัง (แบบไม่โต้ตอบ) ให้ใช้สัญลักษณ์ & ในที่นี้ กระบวนการจะไม่อ่านอินพุตจากผู้ใช้จนกว่าจะถูกย้ายไปยังเบื้องหน้า

cloudcmd &
jobs

คุณยังสามารถส่งกระบวนการไปที่พื้นหลังได้โดยการระงับกระบวนการโดยใช้ [Ctrl + Z] ซึ่งจะส่งสัญญาณ SIGSTOP ไปยังกระบวนการ ดังนั้นจะหยุดการทำงานของกระบวนการ มันกลายเป็นไม่ได้ใช้งาน:

tar -cf backup.tar /backups/*  #press Ctrl+Z
jobs

หากต้องการรันคำสั่งที่ถูกระงับข้างต้นต่อไปในเบื้องหลัง ให้ใช้คำสั่ง bg:

bg

หากต้องการส่งกระบวนการเบื้องหลังไปยังเบื้องหน้า ให้ใช้คำสั่ง fg ร่วมกับรหัสงานดังนี้:

jobs
fg %1

คุณอาจต้องการ: วิธีเริ่มคำสั่ง Linux ในเบื้องหลังและแยกกระบวนการใน Terminal

สถานะของกระบวนการใน Linux

ในระหว่างการดำเนินการ กระบวนการจะเปลี่ยนจากสถานะหนึ่งไปอีกสถานะหนึ่ง ขึ้นอยู่กับสภาพแวดล้อม/สถานการณ์ ใน Linux กระบวนการมีสถานะที่เป็นไปได้ดังต่อไปนี้:

  • กำลังทำงานอยู่ – นี่กำลังทำงานอยู่ (เป็นกระบวนการปัจจุบันในระบบ) หรือพร้อมที่จะรัน (กำลังรอการกำหนดให้กับหนึ่งใน CPU)
  • กำลังรอ – ในสถานะนี้ กระบวนการกำลังรอให้เหตุการณ์เกิดขึ้นหรือสำหรับทรัพยากรระบบ นอกจากนี้ เคอร์เนลยังแยกความแตกต่างระหว่างกระบวนการรอสองประเภท กระบวนการรอแบบขัดจังหวะ – สามารถถูกขัดจังหวะด้วยสัญญาณ และกระบวนการรอแบบต่อเนื่อง – กำลังรอโดยตรงตามเงื่อนไขของฮาร์ดแวร์ และไม่สามารถถูกขัดจังหวะด้วยเหตุการณ์/สัญญาณใดๆ
  • หยุด – ในสถานะนี้ กระบวนการถูกหยุด โดยปกติโดยการรับสัญญาณ ตัวอย่างเช่น กระบวนการที่กำลังถูกดีบั๊ก
  • ซอมบี้ – ในกรณีนี้ กระบวนการหยุดทำงานแล้ว แต่ยังคงมีรายการอยู่ในตารางกระบวนการ

วิธีดูกระบวนการที่ใช้งานอยู่ใน Linux

มีเครื่องมือ Linux หลายอย่างสำหรับการดู/แสดงรายการกระบวนการที่ทำงานอยู่บนระบบ ทั้งสองแบบแบบดั้งเดิมและที่รู้จักกันดีคือ ps และคำสั่งบนสุด:

1.คำสั่ง PS

โดยจะแสดงข้อมูลเกี่ยวกับการเลือกกระบวนการที่ทำงานอยู่บนระบบดังที่แสดงด้านล่าง:

ps 
ps -e | head 

2. ด้านบน – เครื่องมือตรวจสอบระบบ

top เป็นเครื่องมืออันทรงพลังที่ให้มุมมองแบบเรียลไทม์ของระบบที่ทำงานอยู่ดังที่แสดงในภาพหน้าจอด้านล่าง:

top 

อ่านสิ่งนี้เพื่อดูตัวอย่างการใช้งานยอดนิยมเพิ่มเติม: ตัวอย่างคำสั่งยอดนิยม 12 ตัวอย่างใน Linux

3. การเหลือบมอง – เครื่องมือตรวจสอบระบบ

glances เป็นเครื่องมือตรวจสอบระบบที่ค่อนข้างใหม่พร้อมคุณสมบัติขั้นสูง:

glances

สำหรับคู่มือการใช้งานที่ครอบคลุม โปรดอ่าน: Glances – เครื่องมือตรวจสอบระบบเรียลไทม์ขั้นสูงสำหรับ Linux

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

  1. 20 เครื่องมือบรรทัดคำสั่งเพื่อตรวจสอบประสิทธิภาพของ Linux
  2. 13 เครื่องมือตรวจสอบ Linux ที่มีประโยชน์เพิ่มเติม

วิธีควบคุมกระบวนการใน Linux

Linux ยังมีคำสั่งสำหรับควบคุมกระบวนการต่างๆ เช่น kill, pkill, pgrep และ killall ด้านล่างนี้คือตัวอย่างพื้นฐานบางประการของวิธีใช้งาน:

pgrep -u tecmint top
kill 2308
pgrep -u tecmint top
pgrep -u tecmint glances
pkill glances
pgrep -u tecmint glances

หากต้องการเรียนรู้วิธีใช้คำสั่งเหล่านี้ในเชิงลึก เพื่อฆ่า/ยุติกระบวนการที่ใช้งานอยู่ใน Linux ให้เปิดลิงก์ด้านล่าง:

  1. คำแนะนำในการสั่ง Kill, Pkill และ Killall เพื่อยุติกระบวนการ Linux
  2. วิธีค้นหาและฆ่ากระบวนการทำงานใน Linux

โปรดทราบว่าคุณสามารถใช้มันเพื่อฆ่าแอปพลิเคชันที่ไม่ตอบสนองใน Linux เมื่อระบบของคุณค้าง

การส่งสัญญาณไปยังกระบวนการ

วิธีการพื้นฐานในการควบคุมกระบวนการใน Linux คือการส่งสัญญาณไปให้พวกเขา มีสัญญาณหลายรายการที่คุณสามารถส่งไปยังกระบวนการได้ เพื่อดูสัญญาณทั้งหมดที่ทำงาน:

kill -l

หากต้องการส่งสัญญาณไปยังกระบวนการ ให้ใช้คำสั่ง kill, pkill หรือ pgrep ที่เรากล่าวถึงก่อนหน้านี้ แต่โปรแกรมสามารถตอบสนองต่อสัญญาณได้ก็ต่อเมื่อมีการตั้งโปรแกรมให้จดจำสัญญาณเหล่านั้นเท่านั้น

และสัญญาณส่วนใหญ่มีไว้สำหรับใช้ภายในโดยระบบหรือสำหรับโปรแกรมเมอร์เมื่อเขียนโค้ด ต่อไปนี้เป็นสัญญาณที่เป็นประโยชน์ต่อผู้ใช้ระบบ:

  • SIGHUP 1 – ส่งไปยังกระบวนการเมื่อเทอร์มินัลการควบคุมปิด
  • SIGINT 2 – ส่งไปยังกระบวนการโดยเทอร์มินัลการควบคุมเมื่อผู้ใช้ขัดจังหวะกระบวนการโดยการกด [Ctrl+C]
  • SIGQUIT 3 – ส่งไปยังกระบวนการหากผู้ใช้ส่งสัญญาณออก [Ctrl+D]
  • SIGKILL 9 – สัญญาณนี้จะยุติ (ฆ่า) กระบวนการทันที และกระบวนการจะไม่ดำเนินการล้างข้อมูลใดๆ
  • SIGTERM 15 – นี่เป็นสัญญาณการยุติโปรแกรม (การคิลจะส่งสิ่งนี้ตามค่าเริ่มต้น)
  • SIGTSTP 20 – ส่งไปยังกระบวนการโดยเทอร์มินัลการควบคุมเพื่อขอให้หยุด (เทอร์มินัลหยุด) เริ่มต้นโดยผู้ใช้กด [Ctrl+Z]

ต่อไปนี้เป็นตัวอย่างคำสั่ง kill เพื่อฆ่าแอปพลิเคชัน Firefox โดยใช้ PID เมื่อแอปค้าง:

pidof firefox
kill 9 2687
OR
kill -KILL 2687
OR
kill -SIGKILL 2687  

หากต้องการฆ่าแอปพลิเคชันโดยใช้ชื่อ ให้ใช้ pkill หรือ killall ดังนี้:

pkill firefox
killall firefox 

การเปลี่ยนลำดับความสำคัญของกระบวนการ Linux

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

อย่างไรก็ตาม ผู้ใช้ระบบที่มีสิทธิ์ใช้งานรูทสามารถกำหนดสิ่งนี้ได้ด้วยคำสั่ง nice และ renice

จากเอาต์พุตของคำสั่ง top NI จะแสดงค่า nice ของกระบวนการ:

top  

ใช้คำสั่ง nice เพื่อตั้งค่าที่ดีสำหรับกระบวนการ โปรดทราบว่าผู้ใช้ทั่วไปสามารถระบุค่าที่ดีตั้งแต่ 0 ถึง 20 ให้กับกระบวนการที่พวกเขาเป็นเจ้าของได้
เฉพาะผู้ใช้รูทเท่านั้นที่สามารถใช้ค่า nice เป็นลบได้

หากต้องการ จัดลำดับความสำคัญ ของกระบวนการ ให้ใช้คำสั่ง renice ดังต่อไปนี้:

renice +8  2687
renice +8  2103

ลองอ่านบทความที่เป็นประโยชน์เกี่ยวกับวิธีจัดการและควบคุมกระบวนการ Linux

  1. การจัดการกระบวนการ Linux: การบูต การปิดเครื่อง และทุกสิ่งในระหว่างนั้น
  2. ค้นหากระบวนการ 15 อันดับแรกตามการใช้หน่วยความจำด้วย 'บนสุด' ในโหมดแบทช์
  3. ค้นหากระบวนการที่ทำงานสูงสุดตามหน่วยความจำและการใช้งาน CPU สูงสุดใน Linux
  4. วิธีค้นหาชื่อกระบวนการโดยใช้หมายเลข PID ใน Linux

นั่นคือทั้งหมดที่สำหรับตอนนี้! คุณมีคำถามหรือแนวคิดเพิ่มเติม โปรดแบ่งปันกับเราผ่านแบบฟอร์มคำติชมด้านล่าง