ผู้นำเซสชันคืออะไรps -d
ซึ่งเลือกกระบวนการทั้งหมดยกเว้นผู้นำเซสชัน
ผู้นำเซสชันคืออะไรps -d
ซึ่งเลือกกระบวนการทั้งหมดยกเว้นผู้นำเซสชัน
คำตอบ:
ใน 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)สำหรับรายละเอียดเต็มไปด้วยเลือด)
ฉันไม่คิดว่าจะมีคำพิเศษสำหรับสมาชิกของเซสชันหรือกลุ่มกระบวนการที่ไม่ใช่ผู้นำ
ผู้นำเซสชันเป็นกระบวนการที่ session id == id กระบวนการ สิ่งนี้ฟังดูแล้ว แต่รหัสเซสชันนั้นสืบทอดโดยกระบวนการลูก การดำเนินการบางอย่างภายใน UNIX / Linux ดำเนินการกับกระบวนการเซสชันตัวอย่างเช่นการปฏิเสธ ID กระบวนการเมื่อส่งไปยังการเรียกหรือคำสั่งระบบ kill การใช้งานทั่วไปสำหรับสิ่งนี้คือเมื่อออกจากระบบของเชลล์ ระบบปฏิบัติการจะส่งkill -HUP -$$
ซึ่งจะส่งสัญญาณ SIGHUP (hangup) ไปยังกระบวนการทั้งหมดที่มีรหัสเซสชันเดียวกับเชลล์ เมื่อคุณปฏิเสธกระบวนการรหัสเซสชันของกระบวนการจะเปลี่ยนจากเชลล์ดังนั้นจะไม่ตอบสนองต่อสัญญาณแฮงค์ นี่เป็นส่วนหนึ่งของกระบวนการที่จะกลายเป็นกระบวนการภูต
กระบวนการส่วนใหญ่ที่เรียกใช้จากตัวจัดการหน้าต่าง / สภาพแวดล้อมแบบกราฟิกมีรหัสเซสชันเดียวกันกับหนึ่งในโปรแกรมเริ่มต้น สิ่งนี้ทำให้ระบบปฏิบัติการสามารถดำเนินการเช่นเดียวกันkill -HUP -$$
กับทุกโปรแกรมเช่นเบราว์เซอร์เครื่องเล่นเพลง libreoffice ไคลเอนต์ IM ฯลฯ นี่เป็นกระบวนการที่ไม่ใช่ผู้นำเซสชัน
ฉันคิดว่าฉันรู้คำตอบนี้ แต่ฉันเขียนโปรแกรม 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) และอ่านส่วนเกี่ยวกับกลุ่มกระบวนการและเซสชั่นเพื่อดูว่าคุณสามารถไขปริศนาออกได้หรือไม่
./sid
และnohup ./sid
และเมื่อคุณเรียกใช้setsid ./sid
, รหัสเซสชั่น (SID) เป็นแบรนด์ใหม่และเป็นเช่นเดียวกับกระบวนการ PID ... ฉันมา ม. ไม่แน่ใจว่าทำไมการป้องกัน nohup ส้อม (หรือดูเหมือนจะ) แต่ฉันคิดว่าฉันมีความคิดทั่วไป ...
ps xao pid,ppid,pgid,sid,comm
เพื่อดูรหัสเหล่านี้