Unix / Linux - การจัดการกระบวนการ
ในบทนี้เราจะพูดถึงรายละเอียดเกี่ยวกับการจัดการกระบวนการใน Unix เมื่อคุณรันโปรแกรมบนระบบ Unix ของคุณระบบจะสร้างสภาพแวดล้อมพิเศษสำหรับโปรแกรมนั้น สภาพแวดล้อมนี้มีทุกสิ่งที่จำเป็นสำหรับระบบในการรันโปรแกรมราวกับว่าไม่มีโปรแกรมอื่นกำลังทำงานอยู่บนระบบ
เมื่อใดก็ตามที่คุณออกคำสั่งใน Unix คำสั่งนั้นจะสร้างหรือเริ่มกระบวนการใหม่ เมื่อคุณลองใช้ไฟล์lsคำสั่งเพื่อแสดงรายการเนื้อหาไดเร็กทอรีคุณเริ่มกระบวนการ กระบวนการพูดง่ายๆคือตัวอย่างของโปรแกรมที่กำลังทำงานอยู่
ระบบปฏิบัติการติดตามกระบวนการผ่านหมายเลข ID ห้าหลักที่เรียกว่า pid หรือ process ID. แต่ละกระบวนการในระบบมีลักษณะเฉพาะpid.
ในที่สุด Pids ก็ทำซ้ำเนื่องจากตัวเลขที่เป็นไปได้ทั้งหมดถูกใช้จนหมดและ pid ถัดไปจะหมุนหรือเริ่มใหม่ ในช่วงเวลาใดก็ตามจะไม่มีกระบวนการสองกระบวนการที่มี pid เดียวกันอยู่ในระบบเนื่องจากเป็น pid ที่ Unix ใช้เพื่อติดตามแต่ละกระบวนการ
การเริ่มต้นกระบวนการ
เมื่อคุณเริ่มกระบวนการ (รันคำสั่ง) มีสองวิธีที่คุณสามารถรันได้ -
- กระบวนการเบื้องหน้า
- กระบวนการเบื้องหลัง
กระบวนการเบื้องหน้า
ตามค่าเริ่มต้นทุกกระบวนการที่คุณเริ่มทำงานในส่วนหน้า รับอินพุตจากแป้นพิมพ์และส่งเอาต์พุตไปที่หน้าจอ
คุณสามารถเห็นสิ่งนี้เกิดขึ้นได้ด้วยไฟล์ lsคำสั่ง หากคุณต้องการแสดงรายการไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบันของคุณคุณสามารถใช้คำสั่งต่อไปนี้ -
$ls ch*.doc
สิ่งนี้จะแสดงไฟล์ทั้งหมดโดยชื่อที่ขึ้นต้นด้วย ch และลงท้ายด้วย .doc -
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc ch06-2.doc
ch01-2.doc ch02-1.doc
กระบวนการทำงานในเบื้องหน้าผลลัพธ์จะถูกส่งไปที่หน้าจอของฉันและหากไฟล์ ls คำสั่งต้องการอินพุตใด ๆ (ซึ่งไม่ได้ทำ) มันรอจากแป้นพิมพ์
ในขณะที่โปรแกรมกำลังทำงานอยู่เบื้องหน้าและใช้เวลานานไม่มีคำสั่งอื่นใดที่สามารถรันได้ (เริ่มกระบวนการอื่น ๆ ) เนื่องจากพรอมต์จะไม่พร้อมใช้งานจนกว่าโปรแกรมจะประมวลผลเสร็จและออกมา
กระบวนการเบื้องหลัง
กระบวนการพื้นหลังทำงานโดยไม่ต้องเชื่อมต่อกับแป้นพิมพ์ของคุณ หากกระบวนการพื้นหลังต้องการการป้อนข้อมูลด้วยแป้นพิมพ์ใด ๆ ก็จะรอ
ข้อดีของการรันโปรเซสในเบื้องหลังคือคุณสามารถรันคำสั่งอื่น ๆ คุณไม่ต้องรอจนกว่าจะเสร็จสมบูรณ์เพื่อเริ่มต้นใหม่!
วิธีที่ง่ายที่สุดในการเริ่มต้นกระบวนการพื้นหลังคือการเพิ่มเครื่องหมายและ (&) ในตอนท้ายของคำสั่ง
$ls ch*.doc &
ซึ่งจะแสดงไฟล์ทั้งหมดที่มีชื่อขึ้นต้นด้วย ch และลงท้ายด้วย .doc -
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc ch06-2.doc
ch01-2.doc ch02-1.doc
ที่นี่ถ้า ls คำสั่งต้องการอินพุตใด ๆ (ซึ่งมันไม่ได้) มันจะเข้าสู่สถานะหยุดจนกว่าเราจะย้ายไปที่เบื้องหน้าและให้ข้อมูลจากแป้นพิมพ์
บรรทัดแรกประกอบด้วยข้อมูลเกี่ยวกับกระบวนการเบื้องหลัง - หมายเลขงานและรหัสกระบวนการ คุณจำเป็นต้องทราบหมายเลขงานเพื่อจัดการระหว่างพื้นหลังและฉากหน้า
กดปุ่ม Enter และคุณจะเห็นสิ่งต่อไปนี้ -
[1] + Done ls ch*.doc &
$
บรรทัดแรกบอกคุณว่าไฟล์ lsกระบวนการพื้นหลังคำสั่งเสร็จสิ้นเรียบร้อยแล้ว อย่างที่สองคือพร้อมต์สำหรับคำสั่งอื่น
รายชื่อกระบวนการทำงาน
ง่ายต่อการดูกระบวนการของคุณเองโดยเรียกใช้ไฟล์ ps (สถานะกระบวนการ) คำสั่งดังนี้ -
$ps
PID TTY TIME CMD
18358 ttyp3 00:00:00 sh
18361 ttyp3 00:01:31 abiword
18789 ttyp3 00:00:00 ps
หนึ่งในแฟล็กที่ใช้บ่อยที่สุดสำหรับ ps คือไฟล์ -f (f สำหรับตัวเต็ม) ซึ่งให้ข้อมูลเพิ่มเติมดังที่แสดงในตัวอย่างต่อไปนี้ -
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
นี่คือคำอธิบายของฟิลด์ทั้งหมดที่แสดงโดย ps -f คำสั่ง -
ซีเนียร์ | คอลัมน์และคำอธิบาย |
---|---|
1 | UID ID ผู้ใช้ที่กระบวนการนี้เป็นของ (บุคคลที่เรียกใช้) |
2 | PID รหัสกระบวนการ |
3 | PPID รหัสกระบวนการหลัก (ID ของกระบวนการที่เริ่มต้น) |
4 | C การใช้งาน CPU ของกระบวนการ |
5 | STIME เวลาเริ่มดำเนินการ |
6 | TTY ประเภทเทอร์มินัลที่เกี่ยวข้องกับกระบวนการ |
7 | TIME เวลาของ CPU ที่ดำเนินการโดยกระบวนการ |
8 | CMD คำสั่งที่เริ่มต้นกระบวนการนี้ |
มีตัวเลือกอื่น ๆ ที่สามารถใช้ร่วมกับ ps คำสั่ง -
ซีเนียร์ | ตัวเลือกและคำอธิบาย |
---|---|
1 | -a แสดงข้อมูลเกี่ยวกับผู้ใช้ทั้งหมด |
2 | -x แสดงข้อมูลเกี่ยวกับกระบวนการที่ไม่มีเทอร์มินัล |
3 | -u แสดงข้อมูลเพิ่มเติมเช่นอ็อพชัน -f |
4 | -e แสดงข้อมูลเพิ่มเติม |
การหยุดกระบวนการ
การสิ้นสุดกระบวนการสามารถทำได้หลายวิธี บ่อยครั้งจากคำสั่งบนคอนโซลการส่งการกดแป้น CTRL + C (อักขระขัดจังหวะเริ่มต้น) จะออกจากคำสั่ง สิ่งนี้ใช้ได้เมื่อกระบวนการทำงานในโหมดเบื้องหน้า
หากกระบวนการทำงานอยู่เบื้องหลังคุณควรรับ Job ID โดยใช้ไฟล์ psคำสั่ง หลังจากนั้นคุณสามารถใช้ไฟล์kill คำสั่งเพื่อฆ่ากระบวนการดังต่อไปนี้ -
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated
ที่นี่ kill คำสั่งยกเลิก first_oneกระบวนการ. หากกระบวนการละเว้นคำสั่ง kill ปกติคุณสามารถใช้kill -9 ตามด้วยรหัสกระบวนการดังต่อไปนี้ -
$kill -9 6738
Terminated
กระบวนการของผู้ปกครองและเด็ก
กระบวนการยูนิกซ์แต่ละกระบวนการมีหมายเลข ID สองหมายเลขที่กำหนดไว้: รหัสกระบวนการ (pid) และรหัสกระบวนการหลัก (ppid) กระบวนการผู้ใช้แต่ละคนในระบบมีกระบวนการหลัก
คำสั่งส่วนใหญ่ที่คุณรันมีเชลล์เป็นพาเรนต์ ตรวจสอบไฟล์ps -f ตัวอย่างที่คำสั่งนี้แสดงรายการทั้ง ID กระบวนการและ ID กระบวนการหลัก
กระบวนการซอมบี้และเด็กกำพร้า
โดยปกติเมื่อกระบวนการย่อยถูกฆ่ากระบวนการพาเรนต์จะได้รับการอัพเดตผ่านไฟล์ SIGCHLDสัญญาณ. จากนั้นผู้ปกครองสามารถทำงานอื่น ๆ หรือรีสตาร์ทลูกใหม่ได้ตามต้องการ อย่างไรก็ตามบางครั้งกระบวนการหลักจะถูกฆ่าก่อนที่ลูกของมันจะถูกฆ่า ในกรณีนี้ "พาเรนต์ของกระบวนการทั้งหมด"initจะกลายเป็น PPID ใหม่ (รหัสกระบวนการหลัก) ในบางกรณีกระบวนการเหล่านี้เรียกว่ากระบวนการเด็กกำพร้า
เมื่อกระบวนการถูกฆ่า a ps รายชื่ออาจยังคงแสดงกระบวนการด้วยไฟล์ Zสถานะ. นี่คือซอมบี้หรือกระบวนการที่ตายแล้ว กระบวนการนี้ตายและไม่ได้ใช้ กระบวนการเหล่านี้แตกต่างจากกระบวนการเด็กกำพร้า พวกเขาดำเนินการเสร็จสิ้นแล้ว แต่ยังคงพบรายการในตารางกระบวนการ
กระบวนการ Daemon
Daemons เป็นกระบวนการเบื้องหลังที่เกี่ยวข้องกับระบบซึ่งมักจะทำงานโดยได้รับอนุญาตจากการร้องขอรูทและเซอร์วิสจากกระบวนการอื่น ๆ
ภูตไม่มีเทอร์มินัลควบคุม มันไม่สามารถเปิดได้/dev/tty. ถ้าคุณทำ"ps -ef" และดูที่ไฟล์ tty ฟิลด์ภูตทั้งหมดจะมีไฟล์ ? สำหรับ tty.
เพื่อความถูกต้อง daemon คือกระบวนการที่ทำงานอยู่เบื้องหลังโดยปกติจะรอให้บางสิ่งเกิดขึ้นซึ่งสามารถทำงานได้ ตัวอย่างเช่นดีมอนเครื่องพิมพ์รอคำสั่งพิมพ์
หากคุณมีโปรแกรมที่เรียกร้องให้มีการประมวลผลที่ยาวนานคุณควรทำให้เป็น daemon และเรียกใช้ในพื้นหลัง
คำสั่งด้านบน
top คำสั่งเป็นเครื่องมือที่มีประโยชน์มากสำหรับการแสดงกระบวนการที่เรียงตามเกณฑ์ต่างๆอย่างรวดเร็ว
เป็นเครื่องมือวินิจฉัยเชิงโต้ตอบที่อัปเดตบ่อยครั้งและแสดงข้อมูลเกี่ยวกับหน่วยความจำกายภาพและเสมือนการใช้งาน CPU ค่าเฉลี่ยโหลดและกระบวนการที่วุ่นวายของคุณ
นี่คือไวยากรณ์ง่ายๆในการเรียกใช้คำสั่งด้านบนและเพื่อดูสถิติการใช้งาน CPU ตามกระบวนการต่างๆ -
$top
รหัสงานเทียบกับรหัสกระบวนการ
โดยปกติแล้วกระบวนการเบื้องหลังและที่ถูกระงับจะถูกจัดการผ่าน job number (job ID). หมายเลขนี้แตกต่างจาก ID กระบวนการและถูกใช้เนื่องจากสั้นกว่า
นอกจากนี้งานอาจประกอบด้วยหลายกระบวนการที่ทำงานเป็นชุดหรือพร้อมกันในเวลาเดียวกัน การใช้ ID งานนั้นง่ายกว่าการติดตามแต่ละกระบวนการ