1. 概要

Linuxオペレーティングシステムは、プロセスごとにPIDを生成します。 このクイックチュートリアルでは、特定のPIDでプロセス名を取得する方法を見ていきましょう。

2. 問題の紹介

いつものように、例で問題を理解しましょう。

まず、長時間実行されるプロセスをシミュレートするための簡単なシェルスクリプトを作成しましょう。

$ cat long-running.sh
#!/bin/bash
echo "PID of $0: $$"
echo "Parameter: $1"
watch -n 300 date > /dev/null

ご覧のとおり、最初に特別な変数 $$ を読み取って、現在のスクリプトのPIDを出力します。 次に、 watch コマンドに、 date コマンドを300秒ごとに実行し、出力を破棄するように指示します。

このようにして、スクリプトを開始するときにそのPIDを知ることができます。 さらに、「長時間実行」プロセスとして実行されます。

$ ./long-running.sh PARAM
PID of ./long-running.sh: 407203
parameter: PARAM

ここで、このPIDしかわからないと仮定して、このPIDで実行されているプロセスを把握したいと思います。

もちろん、期待される結果はlong-running.shスクリプトです。 次に、プロセスを見つける方法を見てみましょう。

3. psコマンドの使用

ps コマンドは、Linuxコマンドラインで現在のプロセスのステータスを確認するための標準ツールです。

さらに、合格することができます -p オプション ps 指定されたプロセスの情報のみを取得するコマンド。次に例を示します。

$ ps -p 407203 
    PID TTY          TIME CMD
 407203 pts/3    00:00:00 long-running.sh

上記の出力が示すように、CMD列に予想されるプロセス名が表示されています。  psコマンドの-oオプションを調整して、必要な情報のみを出力するようにpsに要求することもできます

たとえば、「 -ocomm」をpsコマンドに渡して、プログラムの名前のみを取得できます。

$ ps -p 407203 -o comm
COMMAND
long-running.sh

特定のプロセスを開始するために使用されたコマンドライン全体を知りたい場合は、「-ocommand」をpsに渡すことができます。

$ ps -p 407203 -o command
COMMAND
/bin/bash ./long-running.sh PARAM

出力が示すように、今回は、 ps コマンドは、プロセスの開始に使用されたパラメーターを含む完全なコマンドを報告します。

上記の出力の「COMMAND」などの列ヘッダーを抑制して、結果を他のプログラムに簡単に渡してさらに処理できるようにしたい場合があります。

ps出力からのヘッダーを抑制するには、-oColumnNameオプションの後に「=」文字を追加するだけです

$ ps -p 407203 -o command=
/bin/bash ./long-running.sh PARAM

4. 下のファイルを読む / proc / ディレクトリ

/ proc ディレクトリは、すべてのLinuxディストリビューションに存在します。 このディレクトリは仮想ファイルシステムです。 / procディレクトリには、プロセスに関する詳細と、カーネル、メモリ使用量、CPUデータ、構成パラメータなどの他のシステム情報が含まれています。 オペレーティングシステムは、起動時に /procをマウントします。

各プロセスには、PIDという名前の/procディレクトリの下にサブディレクトリがあります。 たとえば、プロセス407203の情報を確認する場合は、 / proc /407203ディレクトリに入ることができます。 それぞれの下に多くの「ファイル」があります / proc / ディレクトリ。 これらのファイルには、プロセスに関する詳細情報が含まれています。

$ ls /proc/407203  
arch_status	    cwd@	maps	        pagemap	      stat
attr/		     environ	mem	       personality   statm
...
exe@ ...
cmdline		     io		ns/	       sessionid     timers
comm ...

プロセスの名前またはコマンドラインを取得するために、comm、exe、およびcmdlineの3つのファイルを読み取ることができます。次に、それらの動作を見てみましょう。

プロセスのプログラム名を取得するには、commファイルを読み取ることができます。

$ cat /proc/407203/comm
long-running.sh

exeファイルはシンボリックリンクです。 実際のコマンドファイルにリンクして、プロセスを開始します。

$ ls -l /proc/407203/exe 
lrwxrwxrwx 1 kent kent 0 Apr 26 09:20 /proc/407203/exe -> /usr/bin/bash

プロセスは常にシェルによって開始されるシェルスクリプトであるため、 exe ファイルはシェルコマンド(この場合は / usr / bin / bash )にリンクするだけです。 。 ただし、プロセスが通常のプログラムによって開始された場合、exeファイルは実行可能ファイルを指します。

$ ls -l /proc/437301/exe 
lrwxrwxrwx 1 kent kent 0 Apr 26 09:17 /proc/437301/exe -> /usr/bin/vim

上記の例は、vimプロセスを示しています。

ただし、プロセスを開始した完全なコマンドとそのパラメーターを知りたい場合は、cmdlineファイルを確認できます。

$ cat /proc/407203/cmdline 
/bin/bash./long-running.shPARAM

上記の出力が示すように、シェルコマンド、スクリプト名、およびスクリプトパラメータが出力されますが、これらは区切り文字なしで結合されます。

実際には、出力はヌル文字で区切られています。 -A オプション(すべて表示)を cat コマンドに渡すと、それらを確認できます。

$ cat -A /proc/407203/cmdline
/bin/bash^@./long-running.sh^@PARAM^@

今回は、ヌル文字が「 ^@」として表されていることがわかります。

trコマンドを使用して出力を再フォーマットできます。 たとえば、すべてのヌル文字をスペースに置き換えることができます。

$ cat /proc/407203/cmdline | tr '\0' ' '
/bin/bash ./long-running.sh PARAM

5. 結論

このクイック記事では、Linuxコマンドラインで特定のPIDの名前とコマンドラインを取得する方法について説明しました。

The ps -p コマンドは、PIDのプロセス情報を取得するのに非常に簡単です。 または、特別な / proc / PID ディレクトリにアクセスして、プロセス情報を取得することもできます。