Apa itu "pemimpin sesi" di `ps`?

78

Apa yang dimaksud dengan pemimpin sesi, seperti ps -dyang memilih semua proses kecuali pemimpin sesi?

ini aku
sumber

Jawaban:

84

Di Linux, setiap proses memiliki beberapa ID yang terkait dengannya, termasuk:

  • ID Proses (PID)

    Ini adalah nomor arbitrer yang mengidentifikasi proses. Setiap proses memiliki ID unik, tetapi setelah proses keluar dan proses induk mengambil status keluar, ID proses dibebaskan untuk digunakan kembali oleh proses baru.

  • ID Proses Induk (PPID)

    Ini hanya PID dari proses yang memulai proses tersebut.

  • ID Grup Proses (PGID)

    Ini hanya PID dari pemimpin grup proses. Jika PID == PGID, maka proses ini adalah pemimpin grup proses.

  • ID Sesi (SID)

    Ini hanya PID dari pemimpin sesi. Jika PID == SID, maka proses ini adalah pemimpin sesi.

Sesi dan kelompok proses hanyalah cara untuk memperlakukan sejumlah proses terkait sebagai satu unit. Semua anggota grup proses selalu menjadi bagian dari sesi yang sama, tetapi sesi mungkin memiliki beberapa grup proses.

Biasanya, shell akan menjadi pemimpin sesi, dan setiap pipa yang dieksekusi oleh shell itu akan menjadi grup proses. Ini untuk memudahkan membunuh anak-anak dari kerang ketika keluar. (Lihat pintu keluar (3) untuk detail berdarah.)

Saya tidak berpikir ada istilah khusus untuk anggota sesi atau kelompok proses yang bukan pemimpin.

cjm
sumber
5
Catatan: Gunakan ps xao pid,ppid,pgid,sid,communtuk melihat ID ini.
Mike R
1
Mengapa orang tidak memberikan lebih banyak jawaban berdasarkan perbandingan nyata di dunia nyata seperti itu. +1
RootPhoenix
24

Pemimpin sesi adalah proses di mana id sesi == proses id. Ini terdengar dibuat-buat, tetapi id sesi diwarisi oleh proses anak. Beberapa operasi dalam UNIX / Linux beroperasi pada sesi proses, misalnya, meniadakan id proses ketika mengirim ke panggilan sistem atau perintah kill. Penggunaan paling umum untuk ini adalah ketika keluar dari shell. OS akan mengirim kill -HUP -$$, yang akan mengirim sinyal SIGHUP (hangup) ke semua proses dengan id sesi yang sama dengan shell. Ketika Anda menolak suatu proses, id sesi proses diubah dari shell, sehingga tidak akan menanggapi sinyal hangup. Ini adalah salah satu bagian dari proses untuk menjadi proses daemon.

Sebagian besar proses yang dipanggil dari window manager / environment grafis memiliki id sesi yang sama dengan salah satu program startup. Ini memungkinkan OS untuk melakukan kill -HUP -$$operasi yang sama pada semua program: seperti browser Anda, pemutar musik, libreoffice, klien IM, dll. Ini adalah proses yang bukan pemimpin sesi.

Arcege
sumber
Tolong jangan keberatan tapi saya mungkin perlu sedikit klarifikasi lagi - - pemimpin sesi adalah satu, apa yang orang lain panggil, dan apa yang mereka sukai (perilaku, apa yang mereka lakukan berbeda dari Session Leader)?
its_me
Mereka disebut anggota sesi, saya percaya.
Arcege
Saya suka penjelasan Anda, tetapi saya masih kehilangan satu poin: IIUC, setiap saat setiap proses yang saya mulai sebenarnya adalah anak dari shell yang saya gunakan untuk login (kecuali saya tidak mengakui, tentu saja). Mengapa OS tidak hanya berjalan di pohon proses dan membunuh semua saudara dari proses ini dan saudara mereka? (Sebenarnya itulah yang selalu saya pikirkan ... sampai hari ini: D) Jadi, apa alasan di balik menggunakan sesi?
Alois Mahdal
Perlu ada jauh untuk menentukan kapan suatu proses tidak lagi menjadi bagian dari sesi asli (shell login atau daemon, misalnya). Satu pemikiran mungkin untuk secara otomatis mengubah PPID (induk pid) menjadi 1, tetapi itu mematahkan pohon proses. Id sesi baru membuat grup yang dapat mengirim sinyal bersama. Contohnya adalah GUI, jalankan firefox sebagai sesi terpisah. Kemudian, ketika tombol [X] ditekan, kirim sinyal sesi firefox dan anak-anaknya, tetapi manajer jendela tidak terpengaruh - tidak bisa melakukan ini dengan hubungan PPID-PID langsung.
Arcege
Ketika GUI mati, maka seluruh pohon proses, bukan grup sesi, bisa mendapatkan sinyal. Dua perilaku yang diinginkan berbeda: membunuh satu 'aplikasi' (membunuh firefox dan pluginsnya), dibandingkan membunuh semua proses anak (keluar dari gui). Pekerjaan serupa dengan emacs dan chrome, saya harapkan.
Arcege
13

Saya pikir saya tahu jawabannya, tapi saya menulis sebuah program C untuk mencari tahu.

#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;
}

Saya mengkompilasikannya dengan cc -g -o sid sid.c saya menjalankannya beberapa cara berbeda, untuk melihat apa yang terjadi:

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

Saya agak terkejut dengan apa yang diberikan Linux (2.6.39) kembali. Saya juga menemukan halaman manual bagian 7, "kredensial".

Saran saya adalah melakukan man 7 credentials(atau yang setara jika tidak di Linux), dan baca bagian tentang grup proses dan sesi untuk melihat apakah Anda dapat memecahkannya.

Bruce Ediger
sumber
1
Menjadi pemula linux, saya tidak bisa mengerti apa yang Anda katakan. Sepertinya kamu juga bingung? Tapi Anda mungkin cukup berpengetahuan untuk memahami apa arti jawaban Arcege. Jika ya, bisakah Anda menjelaskan hal yang sama dengan lebih jelas?
its_me
Menarik ... terima kasih ... Jadi, id sesi (SID) adalah PID terminal untuk ./siddan nohup ./sid, dan ketika Anda menjalankan setsid ./sid, id sesi (SID) adalah merek baru dan sama dengan proses PID ... I ' Saya tidak yakin mengapa nohup mencegah garpu (atau tampaknya), tapi saya pikir saya punya ide umum ...
Peter.O