PID番号と操作フォルダを取得する方法

PID番号と操作フォルダを取得する方法

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>/cwdreadlink /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

説明する

  1. pgrep pattern- 現在実行中のプロセスを表示し、パターンに一致するプロセスIDを一覧表示します。
    • -x、--正確- 名前がパターンと正確に一致するプロセスのみが一致します。
  2. 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が表示されます。

関連情報