PID番号とそれが機能するフォルダーを取得するにはどうすればよいですか?
異なるフォルダで2つの同じプログラムを実行する場合:
/var/www/public_html/first_folder/test.jar <i>(it runs all the time)</i>
/var/www/public_html/second_folder/test.jar <i>(it runs all the time)</i>
このコマンドを実行するとps aux | grep test.jar
結果:
www-data 3766 0.5 3.8 2959916 75616 ? Sl 15:01 0:13 Java -jar test.jar
www-data 4239 3.4 4.1 2959916 82432 ? Sl 15:31 0:18 Java -jar test.jar
どのPIDがそれであるかわかりません-最初のフォルダーまたは2番目のフォルダー。
pgrep -x program_name_pattern | xargs pwdx
説明
pgrep pattern
-現在実行中のプロセスを調べ、パターンに一致するプロセスIDを一覧表示します。pwdx
-プロセスの現在の作業ディレクトリを報告します。テスト
pgrep -x my_program | xargs pwdx
###Output###
15880: /home/minimax/Desktop/sandbox
15907: /home/minimax/Desktop/sandbox/yet_one_folder
Linuxでは、プロセスの作業ディレクトリは/proc/$pid/cwd
にあります。これは、作業ディレクトリを指す魔法のシンボリックリンクです。 /proc/$pid/cmdline
はプロセスのコマンドラインを示しますが、NULバイトで区切られているため、何らかの処理が必要です。あなたは例えばすることができますいくつかのpgrep
条件に一致するいくつかのプログラムの作業ディレクトリとコマンドラインを取得するには、次のようにします。
for pid in $(pgrep -f test.jar); do
echo "pid: $pid cwd: $(readlink "/proc/$pid/cwd") cmd: $(tr '\0' ' ' < "/proc/$pid/cmdline")"
done
もちろん、すでにPIDを検索した場合は、 ps
、ls -l /proc/<PID>/cwd
またはreadlink /proc/<PID>/cwd
だけで十分です。
lsof
を使用することもできますが、プログラムのコマンドライン引数を表示する方法がわかりません。
$ lsof -a -d cwd -c cat
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cat 30693 someuser cwd DIR 253,1 4096 1700752 /tmp/y
cat 30694 someuser cwd DIR 253,1 4096 1700611 /tmp
FreeBSDでは、これはfstat
コマンドを介して同様に取得できますが、実際のパスを取得するのはやや複雑で時間がかかります。
$(pgrep Java);のpidの場合do fstat -p "$ {pid}" | awk '{if($ 4 == "wd")print' "$ {pid}" '、$ 5、$ 6; } ' 完了|読み取り中-rpid root inum; do printf "%s:" "$ {pid}" find -x "$ {root}" -type d -inum "$ {inum}" 2>/dev/null 完了
lsof
はここであなたの友達です:
lsof -c Java | grep /var/www/public_html
2番目の列はPIDを示しています。