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 งานนั้นง่ายกว่าการติดตามแต่ละกระบวนการ