プロセスのPID番号がわかっている場合、その名前を取得するにはどうすればよいですか?


261

プロセスのPID番号(UNIXマシン上)がある場合、関連するプロセスの名前を調べるにはどうすればよいですか?

私は何をしなければなりませんか?


9
psまたはls -l /proc/$PID/exe
-Eddy_Em

1
@Eddy_Emは実行可能ファイルを提供しますが、これは常にプロセス名ではありません。また、それはポータブルではありません
...-derobert

9
ps -fp PID完全なコマンドを表示します
Temak

回答:


281

すべてのPOSIX準拠システムで、Linuxを使用すると、次を使用できますps

ps -p 1337 -o comm=

ここでは、プロセスはPIDによって選択され-pます。この-oオプションcommは、コマンド名を意味する出力形式を指定します。

参照:ps– The Open Group Base Specifications Issue 6


28
commはコマンドを15文字に切り詰めているようです。command代わりに使用すると修正されます。
ニモ14

1
[Ubuntu 14.04.4 LTS] $ ps -p 1 -o comm= init $ ps -p 1 -o command= / sbin / init; つまり、約15文字ではなく、単にバイナリの名前とフルパスのどちらかです。
-OmarOthman

3
実際にcommは、バイナリの名前を与え、command引数0
robbie

45

プロセスIDまたはpidで使用されるプロセス名またはコマンドは、次の場所から見つけることができます。

/proc/pid/cmdline

することによって

cat /proc/pid/cmdline

ここで、pidは、
たとえばFor Formaple の名前を検索するpidです。

 # ps aux

   ................
   ................
   user  2480  0.0  1.2 119100 12728 pts/0  Sl   22:42   0:01 gnome-terminal
   ................
   ................

pid 2480で使用されるプロセス名を見つけるには、次を使用します。

# cat /proc/2480/cmdline 

 gnome-terminal

14
注意:OPはUNIXに言及しています。すべてのUNIXが、プロセス固有のファイルのようなPlan 9を実装するわけではありません。あなたの答えは、一般的にLinuxにのみ適用されます。
-slhck

3
それは事実ですが、彼らは質問に「linux」というタグを付けました。非LinuxベースのUNIX OSを使っている人はかなり彼らのニーズに合わせて答えを変更することに使用されます
アンドリュー・ホワイト

14

特定のpidを使用してプログラムのパスを取得するには、次を使用できます。

ps ax|egrep "^ [PID]"

または、次を使用できます。

ps -a [PID]

ここに画像の説明を入力してください


1
ps -aターミナルに関連付けられているすべてのプロセスをリストします。入力は受け付けません。
マイケルリー

@MichaelLeeそれはpsバージョンに依存していると思いますが、procps version 3.2.7うまく動作します。
ペドロロビト

8
# ls -la /proc/ID_GOES_HERE/exe

例:

# ls -la /proc/1374/exe
lrwxrwxrwx 1 chmm chmm 0 Mai  5 20:46 /proc/1374/exe -> /usr/bin/telegram-desktop

これは完璧です。
jayarjo

1
おそらくより良い:readlink /proc/1337/exe。readlink-解決されたシンボリックリンクまたは正規のファイル名を出力します。
パブロA

8

pmapを使用できます。私はPID 6649を探しています。そして、余分なプロセスの詳細を切り取ります。

$ pmap 6649 | head -1
6649:   /usr/lib64/firefox/firefox

このコマンドは私が必要以上に助けてくれた、私は開始したプロセスの全ラインを持っている。Javaプロセスの場合、psコマンドjavaを使用すると表示されるのはだけですが、渡された残りのパラメーターはで完全に表示されますpmap
ダニエルアンドレイミンカ

3

また、psと組み合わせてawkを使用することもできます

ps aux | awk '$2 == PID number for a process  { print $0 }'

例:

root@cprogrammer:~# ps aux | awk '$2 == 1 { print $0 }'
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init    

使用できるHEAD LINEを印刷するには

 ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'

                 (or) 

 ps --headers aux |head -n 1; ps aux | awk '$2 == 1 { print $0 }'


root@cprogrammer:~# ps --headers aux |head -n 1 && ps aux | awk '$2 == 1 { print $0 }'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24476  2436 ?        Ss   15:38   0:01 /sbin/init

2
これは、コマンドのどこかに番号が含まれているプロセスも選択するため、不安定です。試してみてくださいps ax | grep 1、それは本当に返すかどうかを確認するinit例えば、プロセスを。(私の場合、それは119行を返します
slhck

1
@slhck回答を変更しました...情報ありがとうございます。ps -p 1 -o comm =は、この質問に最適なオプションです。
ガンガダー

ヘッダーを保持するために2回実行する必要はなく、代わりにps aux | awk 'NR==1 || $2==PID'-を使用{print $0}します。デフォルトであるため、言う必要はありません。しかし、あなたがコメントしたように、-pとにかく良いです。
-dave_thompson_085

3

slhck のAnswerていますが、コマンド呼び出しではなくファイル操作に依存しています。

MYPID=1
cat "/proc/$MYPID/comm"

[Ubuntu 14.04.4 LTS] cat /proc/1/comm=> init、/ sbin / initではありません。彼の答えには、より長いバージョンが含まれています。とにかく+1。
-OmarOthman

2

驚いたことに、psの-f(フルコマンド)オプションについて言及している人はいません。-e(すべて)で使用し、結果をgrepにパイプして、検索を絞り込むことができます。

ps -ef | grep <PID>

これは、システム上の多くのリソースを使用している誰かが実行している完全なコマンドを確認する場合にも非常に便利です。これにより、コマンドに渡されたオプションと引数が表示されます。


3
BSDで動作しません(MacOSXを含むかもしれませんか?わかりません)。-e -f使用可能な場合でも、grepたとえばgrep 33pid = 933または339、ppid = 33または933または339、33秒または33分のtimeused、または33を含むプログラム名または引数(grepそれ自体を含む)を含む、多くの誤った一致を生成できます。すべて(私の知る限り)ps持っている-pだけで、そうps -fp 33
-dave_thompson_085

0

次のコマンドを使用するのが最も簡単な方法です。

ps -awxs | grep pid

に比べて非常に非効率的であることに加えてps -p${pid}、これはgrepそれ自体を含む多くの誤検知を拾います。
トビーSpeight

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