「ps」の「セッションリーダー」とは何ですか?


78

セッションリーダーps -d以外のすべてのプロセスを選択するセッションリーダーとは何ですか?

回答:


84

Linuxでは、すべてのプロセスには、次のようないくつかのIDが関連付けられています。

  • プロセスID(PID)

    これは、プロセスを識別する任意の番号です。すべてのプロセスには一意のIDがありますが、プロセスが終了し、親プロセスが終了ステータスを取得した後、プロセスIDは解放されて新しいプロセスで再利用されます。

  • 親プロセスID(PPID)

    これは、問題のプロセスを開始したプロセスの単なるPIDです。

  • プロセスグループID(PGID)

    これは、プロセスグループリーダーの単なるPIDです。PID == PGIDの場合、このプロセスはプロセスグループリーダーです。

  • セッションID(SID)

    これは、セッションリーダーの単なるPIDです。PID == SIDの場合、このプロセスはセッションリーダーです。

セッションとプロセスグループは、多数の関連プロセスを1つの単位として扱う単なる方法です。プロセスグループのすべてのメンバーは常に同じセッションに属しますが、セッションは複数のプロセスグループを持つことができます。

通常、シェルはセッションリーダーになり、そのシェルによって実行されるすべてのパイプラインはプロセスグループになります。これは、シェルの終了時にシェルの子を簡単に殺すためです。(詳細についてはexit(3)を参照してください。)

リーダーではないセッションまたはプロセスグループのメンバーを表す特別な用語はないと思います。


5
注:ps xao pid,ppid,pgid,sid,commこれらのIDを表示するために使用します。
マイクR 14

1
なぜ人々は、そのような説明の現実世界の比較に基づく回答の多くを与えていない... 1
RootPhoenix

24

セッションリーダーは、セッションID ==プロセスIDのプロセスです。これは不自然に聞こえますが、セッションIDは子プロセスに継承されます。UNIX / Linux内の一部の操作はプロセスセッションで動作します。たとえば、killシステムコールまたはコマンドに送信するときにプロセスIDを無効にします。これの最も一般的な使用法は、シェルからログアウトするときです。OSはを送信しますkill -HUP -$$。これは、シェルと同じセッションIDを持つすべてのプロセスにSIGHUP(ハングアップ)シグナルを送信します。プロセスを否認すると、プロセスのセッションIDはシェルから変更されるため、ハングアップ信号に応答しません。これは、デーモンプロセスになるプロセスの一部です。

ウィンドウマネージャ/グラフィカル環境から呼び出されるプロセスのほとんどは、スタートアッププログラムの1つと同じセッションIDを持っています。これにより、kill -HUP -$$ブラウザ、音楽プレーヤー、libreoffice、IMクライアントなど、OSがすべてのプログラムで同じ操作を実行できます。これらはセッションリーダーではないプロセスです。


気にしないでください、もう少し明確にする必要があります-セッションリーダーは1つで、他の人は何と呼ばれ、どのようなものですか(動作、セッションリーダーとは何が違うのですか)?
its_me

彼らはセッションのメンバーと呼ばれています。
アルセージュ

私はあなたの説明が好きですが、私はまだ1つのポイントが欠けています:IIUC、私が開始したすべてのプロセスはいつでも実際にログインしたシェルの子です(もちろん、私はそれを否定していなければ)。OSがプロセスツリーをたどって、このプロセスのすべての兄弟とその兄弟を強制終了しないのはなぜですか?(実際、それは私がいつも思っていたことです...今日まで:D)では、代わりにセッションを使用する背後にある理由は何ですか?
アロイスマーダル

プロセスが元のセッション(ログインシェルやデーモンなど)の一部ではなくなった時点を判断する必要があります。1つの考えは、PPID(親pid)を自動的に1に変更することかもしれませんが、それはプロセスツリーを壊します。新しいセッションIDは、一緒にシグナルを送信できるグループを作成します。この例はGUIで、firefoxを別のセッションとして起動します。次に、[X]ボタンが押されたときに、firefoxのセッションとその子にシグナルを送信しますが、ウィンドウマネージャーは影響を受けません-まっすぐなPPID-PID関係ではできません。
アルセージュ

GUIが終了すると、セッショングループではなくプロセスツリー全体がシグナルを取得できます。2つの異なる望ましい動作:1つの「アプリ」を殺す(firefoxとそのプラグインを殺す)、またはすべての子プロセスを殺す(guiを終了する)。emacsとchromeで同様の動作をすることを期待しています。
アルセージュ

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のマニュアルページ「credentials」も見つけました。

私のアドバイスはman 7 credentials(またはLinux以外の場合は同等の方法で)、プロセスグループとセッションに関するセクションを読んで、それを解決できるかどうかを確認することです。


1
Linuxの初心者なので、あなたが言ったことはわかりませんでした。あなたも困惑しているように見えますか?しかし、おそらく、あなたはArcegeの答えの意味を理解するのに十分な知識を持っているでしょう。もしそうなら、同じことをより明確に説明してもらえますか?
its_me

おもしろい...ありがとう...それで、セッションID(SID)はとの端末のPID./sidありnohup ./sid、実行するsetsid ./sidと、セッションID(SID)は真新しく、プロセスPIDと同じです... I ' nohupがフォークを妨げた(またはそうだった)理由は
わかり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.