“ ผู้นำเซสชัน” ใน“ ps` คืออะไร?


คำตอบ:


84

ใน Linux ทุกกระบวนการมี ID ที่เกี่ยวข้องหลายตัวรวมถึง:

  • Process ID (PID)

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

  • Parent Process ID (PPID)

    นี่เป็นเพียง PID ของกระบวนการที่เริ่มต้นกระบวนการที่เป็นปัญหา

  • Process Group ID (PGID)

    นี่เป็นเพียง PID ของผู้นำกลุ่มกระบวนการ ถ้า PID == PGID แสดงว่ากระบวนการนี้เป็นหัวหน้ากลุ่มกระบวนการ

  • Session ID (SID)

    นี่เป็นเพียง PID ของผู้นำเซสชัน ถ้า PID == SID แสดงว่ากระบวนการนี้เป็นผู้นำเซสชัน

เซสชั่นและกลุ่มกระบวนการเป็นเพียงวิธีที่จะปฏิบัติต่อกระบวนการที่เกี่ยวข้องเป็นหน่วย สมาชิกทั้งหมดของกลุ่มกระบวนการมักจะเป็นของเซสชันเดียวกันเสมอ แต่เซสชันนั้นอาจมีกลุ่มกระบวนการหลายกลุ่ม

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

ฉันไม่คิดว่าจะมีคำพิเศษสำหรับสมาชิกของเซสชันหรือกลุ่มกระบวนการที่ไม่ใช่ผู้นำ


5
หมายเหตุ: ใช้ps xao pid,ppid,pgid,sid,commเพื่อดูรหัสเหล่านี้
Mike R

1
ทำไมผู้คนถึงไม่ให้คำตอบจากการเปรียบเทียบในโลกแห่งความเป็นจริงมากขึ้นเช่นกัน .. +1
RootPhoenix

24

ผู้นำเซสชันเป็นกระบวนการที่ session id == id กระบวนการ สิ่งนี้ฟังดูแล้ว แต่รหัสเซสชันนั้นสืบทอดโดยกระบวนการลูก การดำเนินการบางอย่างภายใน UNIX / Linux ดำเนินการกับกระบวนการเซสชันตัวอย่างเช่นการปฏิเสธ ID กระบวนการเมื่อส่งไปยังการเรียกหรือคำสั่งระบบ kill การใช้งานทั่วไปสำหรับสิ่งนี้คือเมื่อออกจากระบบของเชลล์ ระบบปฏิบัติการจะส่งkill -HUP -$$ซึ่งจะส่งสัญญาณ SIGHUP (hangup) ไปยังกระบวนการทั้งหมดที่มีรหัสเซสชันเดียวกับเชลล์ เมื่อคุณปฏิเสธกระบวนการรหัสเซสชันของกระบวนการจะเปลี่ยนจากเชลล์ดังนั้นจะไม่ตอบสนองต่อสัญญาณแฮงค์ นี่เป็นส่วนหนึ่งของกระบวนการที่จะกลายเป็นกระบวนการภูต

กระบวนการส่วนใหญ่ที่เรียกใช้จากตัวจัดการหน้าต่าง / สภาพแวดล้อมแบบกราฟิกมีรหัสเซสชันเดียวกันกับหนึ่งในโปรแกรมเริ่มต้น สิ่งนี้ทำให้ระบบปฏิบัติการสามารถดำเนินการเช่นเดียวกันkill -HUP -$$กับทุกโปรแกรมเช่นเบราว์เซอร์เครื่องเล่นเพลง libreoffice ไคลเอนต์ IM ฯลฯ นี่เป็นกระบวนการที่ไม่ใช่ผู้นำเซสชัน


โปรดอย่ากังวล แต่ฉันอาจต้องการคำชี้แจงเพิ่มเติมเล็กน้อย - - ผู้นำเซสชันคือหนึ่งสิ่งที่คนอื่นเรียกและสิ่งที่พวกเขาชอบ (พฤติกรรมพวกเขาทำอะไรแตกต่างจากผู้นำเซสชัน)?
its_me

พวกเขาถูกเรียกว่าเป็นสมาชิกของเซสชันฉันเชื่อ
Arcege

ฉันชอบคำอธิบายของคุณ แต่ฉันยังขาดประเด็นหนึ่ง: IIUC ทุกครั้งที่ฉันเริ่มกระบวนการเป็นลูกของเชลล์ที่ฉันลงชื่อเข้าใช้ด้วย (เว้นแต่ฉันจะปฏิเสธแน่นอน) ทำไม OS ไม่เพียงแค่เดินแผนผังกระบวนการและฆ่าพี่น้องทั้งหมดของกระบวนการนี้และพี่น้องของพวกเขา? (ที่จริงแล้วคือสิ่งที่ฉันคิดเสมอว่าจะทำ ... จนถึงวันนี้: D) แล้วเหตุผลที่ใช้เซสชันแทนคืออะไร?
Alois Mahdal

ต้องไม่อยู่ที่การพิจารณาเมื่อกระบวนการไม่ได้เป็นส่วนหนึ่งของเซสชันเดิมอีกต่อไป (ตัวอย่างเช่น login shell หรือ daemon) ความคิดหนึ่งอาจจะเปลี่ยน PPID (parent pid) เป็น 1 โดยอัตโนมัติ แต่จะทำให้โครงสร้างกระบวนการแตก รหัสเซสชันใหม่สร้างกลุ่มที่สามารถส่งสัญญาณพร้อมกันได้ ตัวอย่างนี้คือ GUI ปิด firefox เป็นเซสชันแยกต่างหาก จากนั้นเมื่อกดปุ่ม [X] ให้ส่งสัญญาณเซสชันของ firefox และลูก ๆ ของมัน แต่ตัวจัดการหน้าต่างไม่ได้รับผลกระทบ - ไม่สามารถทำได้ด้วยความสัมพันธ์แบบ PPID-PID แบบตรง
Arcege

เมื่อ GUI ตายจากนั้นแผนผังกระบวนการทั้งหมดไม่ใช่กลุ่มเซสชันสามารถรับสัญญาณได้ พฤติกรรมที่ต้องการสองอย่างที่แตกต่างกันคือการฆ่า 'แอป' หนึ่งอัน (ฆ่า Firefox และปลั๊กอิน) กับการฆ่ากระบวนการลูกทั้งหมด (ออกจาก gui) ฉันคาดว่าจะได้ผลคล้ายกับ emacs และโครเมียม
Arcege

13

ฉันคิดว่าฉันรู้คำตอบนี้ แต่ฉันเขียนโปรแกรม C เพื่อหาคำตอบ

#include <stdio.h>
#include <unistd.h>

int
main(int ac, char **av)
{
        pid_t sid, mypid, pgid, gid;

        mypid = getpid();
        sid = getsid(0);
        pgid = getpgid(0);
        gid = getpgrp();

        printf("PID %d\n", mypid);
        printf("process group ID of session leader: %d\n", sid);
        printf("process group ID: %d\n", pgid);
        printf("process group ID: %d\n", gid);

        if (!fork())
        {
                mypid = getpid();
                sid = getsid(0);
                pgid = getpgid(0);
                gid = getpgrp();

                printf("child PID %d\n", mypid);
                printf("process group ID of session leader: %d\n", sid);
                printf("process group ID: %d\n", pgid);
                printf("process group ID: %d\n", gid);

                _exit(0);
        }

        return 0;
}

ฉันรวบรวมมันด้วยcc -g -o sid sid.c ฉันวิ่งไปหลายวิธีเพื่อดูว่าเกิดอะไรขึ้น:

./sid
nohup ./sid > sid.out
setsid ./sid

ฉันรู้สึกประหลาดใจกับสิ่งที่ Linux (2.6.39) ให้กลับคืนมา ฉันยังพบหน้าส่วนที่ 7 "ข้อมูลรับรอง"

คำแนะนำของฉันคือการทำman 7 credentials(หรือเทียบเท่าถ้าไม่ได้อยู่บน Linux) และอ่านส่วนเกี่ยวกับกลุ่มกระบวนการและเซสชั่นเพื่อดูว่าคุณสามารถไขปริศนาออกได้หรือไม่


1
เป็นมือใหม่ที่ฉันไม่สามารถทำสิ่งที่คุณพูดได้ ดูเหมือนว่าคุณจะงงด้วยเหรอ? แต่คุณอาจมีความรู้พอที่จะเข้าใจความหมายของคำตอบของ Arcege ถ้าเป็นเช่นนั้นคุณช่วยอธิบายให้ชัดเจนขึ้นได้ไหม?
its_me

ที่น่าสนใจ ... ขอบคุณ ... ดังนั้นรหัสเซสชั่น (SID) เป็นขั้วของPIDสำหรับ./sidและnohup ./sidและเมื่อคุณเรียกใช้setsid ./sid, รหัสเซสชั่น (SID) เป็นแบรนด์ใหม่และเป็นเช่นเดียวกับกระบวนการ PID ... ฉันมา ม. ไม่แน่ใจว่าทำไมการป้องกัน nohup ส้อม (หรือดูเหมือนจะ) แต่ฉันคิดว่าฉันมีความคิดทั่วไป ...
Peter.O
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.