GNU/Linux >> Linux の 問題 >  >> Linux

Linux:プロセスが開始された場所と開始方法を知る方法は?

解決策 1:

最も信頼できる方法は、 /proc を見ることです プロセスのディレクトリ。各プロセスには /proc/<pid>/ があります 次のような情報を保持するディレクトリ:

<オール>
  • cwd 現在の作業ディレクトリへのリンク
  • fd 開いているファイル (ファイル記述子) へのリンクを含むディレクトリ
  • cmdline プロセスを開始するために使用されたコマンドラインを確認するために読んでください
  • environ そのプロセスの環境変数
  • root プロセスがルート ディレクトリと見なすものへのリンク (chroot されない限り / になります)
  • 各プロセス /proc にはさらに優れた情報がありますが、上記のものを使用すると、何が起こっているかを正確に知ることができます。

    また、 ps auxf を使用 誰が何をフォークしたかが表示されるので、誰があなたの perl を呼び出しているかをよりよく知ることができます。

    解決策 2:

    ほとんどの場合、ps を実行するだけです ワイド出力を有効にするためのお気に入りのフラグと一緒に、通常は十分です。 ps -feww に傾いています 、しかし、ここでの他の提案は機能します。プログラムが誰かの $PATH から開始された場合に注意してください 、完全なパスではなく、実行可能ファイルの名前のみが表示されます。たとえば、これを試してください:

    $ lftp &
    $ ps -feww | grep ftp
    lars      9600  9504  0 11:30 pts/10   00:00:00 lftp
    lars      9620  9504  0 11:31 pts/10   00:00:00 grep ftp
    

    ps に表示される情報に注意することが重要です。 実行中のプログラムによって完全に上書きされる可能性があります。たとえば、このコード:

    int main (int argc, char **argv) {
            memset(argv[0], ' ', strlen(argv[0]));
            strcpy(argv[0], "foobar");
            sleep(30);
            return(0);
    }
    

    これを「myprogram」というファイルにコンパイルして実行すると:

    $ gcc -o myprogram myprogram.c
    $ ./myprogram &
    [1] 10201
    

    そして ps を実行します 、別のプロセス名が表示されます:

    $ ps -f -p 10201
    UID        PID  PPID  C STIME TTY          TIME CMD
    lars     10201  9734  0 11:37 pts/10   00:00:00 foobar
    

    /proc/<pid>/exe を直接見ることもできます これは、適切な実行可能ファイルへのシンボリック リンクである場合があります。上記の例では、これにより ps よりもはるかに有用な情報が得られます。 :

    $ls -l /proc/9600/exe
    lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp
    

    解決策 3:

    私の場合、ちょうど今、pstree を見つけました ps aux よりも、プロセスがどのように開始されたかをより明確に示します。

    次のようになります:

      ├─lightdm─┬─Xorg
      │         ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[{apache2}]]
      │         │         │      ├─at-spi-bus-laun─┬─dbus-daemon
      │         │         │      │                 └─3*[{at-spi-bus-laun}]
      │         │         │      ├─at-spi2-registr───{at-spi2-registr}
      │         │         │      ├─dbus-daemon
      │         │         │      ├─dropbox───29*[{dropbox} ]
    

    解決策 4:

    使用できます:

    systemctl status <PID>
    

    またはプロセスの名前:

    systemctl status $(pgrep perl)
    

    これにより、プロセスを開始した systemd サービスに関する情報が提供されます。

    ここでこのヒントを見つけました

    解決策 5:

    ps axww | grep perl を試してください プロセスの完全なコマンド ラインを取得します。 top のようです 長い行を削除しました。


    Linux
    1. Linuxにvtopをインストールする方法

    2. Linux ですべてのプロセスの起動をログに記録するにはどうすればよいですか?

    3. Linux - プロセスがいつ開始されたかを確認するにはどうすればよいですか?

    1. Linuxでゾンビプロセスを強制終了する方法

    2. 古いOSを捨ててLinuxに飛び込んだ方法

    3. Linuxを始めたきっかけは何ですか?

    1. Linuxコマンドをバックグラウンドで起動し、ターミナルでプロセスをデタッチする方法

    2. Linuxでゾンビプロセスを見つけて殺す方法

    3. プロセス監視のために Linux に Monit をインストールして構成する方法