web-dev-qa-db-ja.com

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

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

83
its_me

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

  • プロセスID(PID)

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

  • 親プロセスID(PPID)

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

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

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

  • セッションID(SID)

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

セッションとプロセスグループは、関連する多数のプロセスを1つの単位として扱うための単なる方法です。プロセスグループのすべてのメンバーは常に同じセッションに属していますが、セッションには複数のプロセスグループが存在する場合があります。

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

リーダーではないセッションまたはプロセスグループのメンバーに特別な用語があるとは思いません。

87
cjm

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

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

24
Arcege

これに対する答えはわかっていると思いましたが、これを理解するために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以外の場合は同等)を実行し、プロセスグループとセッションに関するセクションを読んで、それを困惑させることができるかどうかを確認することです。

13
Bruce Ediger