ถ้าเราพิมพ์ps -ef
แล้วเราจะได้รับรายการกระบวนการ ทำไมหมายเลข PID ไม่ต่อเนื่อง
ถ้าเราพิมพ์ps -ef
แล้วเราจะได้รับรายการกระบวนการ ทำไมหมายเลข PID ไม่ต่อเนื่อง
คำตอบ:
บน Ubuntu พวกมันต่อเนื่อง ในระบบปฏิบัติการอื่นมันอาจแตกต่างกัน
เคอร์เนลจะจัดสรร PID ในช่วง (RESERVED_PIDS, PID_MAX_DEFAULT) มันทำตามลำดับในแต่ละเนมสเปซ (งานในเนมสเปซที่แตกต่างกันสามารถมี ID เดียวกันได้) ในกรณีที่ช่วงหมดการกำหนด pid จะวนไปมา
( /programming/3446727/how-does-linux-determine-the-next-pid )
ใจแม้ว่า ...
บางหัวข้อใน stackoverflow:
ในความคิดเห็นคือคำสั่งเพื่อทดสอบการกำหนด PID:
for i in {1..20}; do sh -c 'echo $$'; done
ID กระบวนการที่หายไปในระหว่างนั้นจะตายไปแล้วและ PID ของพวกเขาจะถูกนำกลับมาใช้ใหม่โดยเคอร์เนลในกระบวนการภายหลัง
กระบวนการที่ตายแล้วจะไม่ปรากฏในตารางกระบวนการ (ยกเว้นซอมบี้) ดังนั้นps -ef
จะไม่แสดงกระบวนการเหล่านั้น
ปกติ PID อย่างต่อเนื่อง ps -ef
แต่กระบวนการบางอย่างจะตายเพียงแค่เวลาที่คุณเรียกใช้คำสั่ง
นอกจากนี้กระบวนการบางอย่างอาจเป็นเพียงกระบวนการย่อยของกระบวนการอื่นซึ่งไม่ได้แสดงไว้ในps -ef
คำสั่ง หากต้องการดูผลลัพธ์ที่ขยายออกมาและคุณสามารถตรวจสอบ PID อย่างต่อเนื่องได้pstree
pstree -p
ตัวอย่างผลลัพธ์:
├─teamviewerd(3468)─┬─{teamviewerd}(3474)
│ ├─{teamviewerd}(3475)
│ ├─{teamviewerd}(3476)
│ ├─{teamviewerd}(3477)
│ ├─{teamviewerd}(3478)
ในขณะที่ถ้าคุณเรียกใช้ps -ef
คุณจะเห็นกระบวนการหลัก
$ ps -ef | grep teamviewerd
root 3468 1 0 Jul15 ? 00:07:38 /opt/teamviewer9/tv_bin/teamviewerd -f
พวกมันต่อเนื่อง PID ถูกกำหนดตามลำดับจนกระทั่งถึงขีด จำกัด สูงสุด หลังจากขีด จำกัด นี้จะเริ่มต้นอีกครั้งจากศูนย์
ดังนั้นมันเป็นเพียงว่า PID ที่ขาดหายไปps -ef
นั้นเป็นกระบวนการที่ตายแล้ว โปรดทราบว่าps -ef
รายการกระบวนการที่ทำงานอยู่เท่านั้น