web-dev-qa-db-ja.com

それが機能する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
K Deis
pgrep -x program_name_pattern | xargs pwdx

説明

  1. pgrep pattern-現在実行中のプロセスを調べ、パターンに一致するプロセスIDを一覧表示します。
    • -x、-exact-名前がパターンと完全に一致するプロセスのみに一致します。
  2. pwdx-プロセスの現在の作業ディレクトリを報告します。

テスト

pgrep -x my_program | xargs pwdx

###Output###
15880: /home/minimax/Desktop/sandbox
15907: /home/minimax/Desktop/sandbox/yet_one_folder
0
MiniMax

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を検索した場合は、 psls -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 
完了
5
ilkkachu

lsofはここであなたの友達です:

lsof -c Java | grep /var/www/public_html

2番目の列はPIDを示しています。

0
baselab