Linux:プロセスの開始場所と開始方法を知る方法


33

私はLinuxのボックスをチェックしていましたが、perlプロセスが実行され、CPUの使用率がかなり高いことがわかりました。topを使用すると、プロセス名にのみperlを指定できます。

cを押してコマンドラインを表示すると、/ var / spool / mailが表示されました。これはディレクトリなので、意味がありません。

私の質問は:

1)なぜこれが起こったのですか?このperlプロセスはコマンドラインをどのようにマスクできますか?2)プロセスが開始された場所と方法を確認する最も信頼できる方法は何ですか?

ありがとう!

回答:


36

ほとんどの場合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

1
すべてのファイルは/proc、プログラムに関するすべての情報を提供しexe、実行可能ファイルcwdへのリンク、現在の作業ディレクトリfdへのリンク、ディレクトリには開いているファイルへのリンクが含まれます(標準入力、出力、標準エラーを含む)
Hubert Kario

57

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

  1. cwd 現在の作業ディレクトリへのリンク
  2. fd 開いているファイル(ファイル記述子)へのリンクを含むdir
  3. cmdline プロセスを開始するために使用されたコマンドラインを確認するためにそれを読んでください
  4. environ そのプロセスの環境変数
  5. root プロセスがルートディレクトリと見なすものへのリンク(chrootされない限り/になります)

各プロセス/ procにはさらにクールな情報がありますが、上記のものを使用すると、何が起こっているかを正確に知ることができます。

また、ps auxffork を使用すると、誰が何を分岐したかが表示されるため、perlを呼び出しているユーザーをより正確に把握できます。


Windowsでは常にProcess Explorerを使用していますが、Linuxでも同等のものがあるのではないかと考えました。そのスイッチはそれをすべて行います!ps auxf ...いいね!
ヤニックギルアール

1
psのfパラメータに+1を追加しました。
レナート・ローランド14年

2
+1は、そのような基本的な概念のように見えるものを教えてくれます... /procプロセス情報が含まれています!誰かわかったね??私は永遠にそこに見えたすべてだったversioncpuinfoとか...プラスPSの私のルータのバージョンは、すべてのパラメータは無視されているため、これは私の実際の問題を解決
復活モニカ- NACHT

@coredump:プロセスがchroot()以前に呼び出された場合、どのディレクトリに/proc/ᴘɪᴅ/cwd対応するかをどのように知ることができますか?
-user2284570

10

私にとっては、ちょうど今、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} ]

2

試してみてくださいps axww | grep perl、あなたのプロセスの完全なコマンドラインを取得します。top長い行をトリミングしたように見えます。


2

tryコマンドを使用 fuser -vu /var/spool/mail このコマンドは、指定されたファイルまたはファイルシステムを使用しているプロセスのPIDを表示します。デフォルトの表示モードでは、各ファイル名の後に、アクセスのタイプを示す文字が続きます。

c-現在のディレクトリ。e-実行中の実行可能ファイル。f-ファイルを開きます。fはデフォルトの表示モードでは省略されます。r-ルートディレクトリ。m-mmapされたファイルまたは共有ライブラリ。

たぶんそれはあなたが探している答えにあなたの検索を進めるのに役立つでしょう。役に立つかどうかはわかりませんが、役に立つ情報が見つかるかもしれません。


1

正確なフラグについてはマニュアルページを参照してください。コマンドラインと開始時刻を簡単に把握するには、ps auxwwwを使用する必要があります。必要に応じて、manページを読んでよりエレガントにすることができます。


1

2つのコマンドが思い浮かびます。

1) ' ps ' からプロセスの開始時間を取得します。

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2)lastcomm、今チェックしていますが、インストールしていません。とにかく、マニュアルページの説明は言う:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

しかし、数人が言ったように、「ls -al / proc /」は多くを語ってくれます!


0

次を使用できます。

systemctl status <PID>

またはプロセスの名前で:

systemctl status $(pgrep perl)

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.