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番目のフォルダなのかわかりません。
答え1
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を取得してください。 fstat -p "${pid}" | fstat -p "${pid}" | awk '{ if ($4 == "wd") 印刷 '"${pid}"',$5,$6; 完了読み込み中 -r pid root inum; printf "%s: " "${pid}" -x "${root}" -type d -inum "${inum}" 2>/dev/null 検索 完璧
答え2
pgrep -x program_name_pattern | xargs pwdx
説明する
pgrep pattern
- 現在実行中のプロセスを表示し、パターンに一致するプロセスIDを一覧表示します。- -x、--正確- 名前がパターンと正確に一致するプロセスのみが一致します。
pwdx
- プロセスの現在の作業ディレクトリを報告します。
テスト
pgrep -x my_program | xargs pwdx
###Output###
15880: /home/minimax/Desktop/sandbox
15907: /home/minimax/Desktop/sandbox/yet_one_folder
答え3
lsof
あなたの友達はここにいますか:
lsof -c java | grep /var/www/public_html
2番目の列にはPIDが表示されます。