実行環境
- bash
- zsh
概要
プロセスの番号を調べることがあるのですが、その場合に同じ起動コマンドで起動されたプロセスの場合、作業ディレクトリがどこなのかわからず、自分の求めているプロセス番号がどれなのかわからないことがあります。
ここではプロセス番号と作業ディレクトリを表示する方法についてまとめました。
実行コマンド
for pid in `ps aux | grep keyword1 |grep keyword2 | grep -v grep | tr -s ' ' | cut -d ' ' -f2`
do
ls -l /proc/$pid/cwd;
ps $pid
done
次に組み合わせたコマンドを説明します。
PID一覧の取得
プロセス一覧を取得
ps aux
を使います。
ps aux
プロセスをフィルタ
grep
を使ってほしいプロセスを絞り込みます。
grep keyword
キーワードが複数ある場合などはパイプで繋げばOKです。
grep
そのものを除外するために grep -v grep
も付け加えます。
フィールドの区切りを単一のスペースに変換
tr
を使います。
tr -s ' '
PIDのフィールドを抽出
cut
を使います。 スペースで区切った時の2番目のフィールドを抽出します。
cut -d ' ' -f2
ここまでをパイプで繋げて実行すると、ほしいプロセスのPID一覧が取得できます。
取得したPIDについて繰り返し処理
for
を使って取得したPIDについての繰り返し処理を行います。
for pid in `ps aux | grep keyword1 |grep keyword2 | grep -v grep | tr -s ' ' | cut -d ' ' -f2`
do
# procedure
done
作業ディレクトリの取得
for
の中で ls -l /proc/$pid/cwd
を実行します。
for pid in `ps aux | grep keyword1 |grep keyword2 | grep -v grep | tr -s ' ' | cut -d ' ' -f2`
do
ls -l /proc/$pid/cwd
done
プロセス情報の表示
作業ディレクトリの一覧しか表示されませんから、プロセスについて再度表示します。
ps
を使います。
for pid in `ps aux | grep keyword1 |grep keyword2 | grep -v grep | tr -s ' ' | cut -d ' ' -f2`
do
ls -l /proc/$pid/cwd
ps $pid
done
実行例
$ for pid in `ps aux | grep unic |grep master | grep -v grep | tr -s ' ' | cut -d ' ' -f2`; do ls -l /proc/$pid/cwd; ps $pid; done
lrwxrwxrwx 1 ec2-user ec2-user 0 May 17 02:41 /proc/2429/cwd -> /var/www/example1-prod/releases/20200504164325
PID TTY STAT TIME COMMAND
2429 ? Sl 0:01 unicorn_rails master -c config/unicorn.rb -E production -D
lrwxrwxrwx 1 ec2-user ec2-user 0 May 17 02:24 /proc/27484/cwd -> /var/www/example2-prod/releases/20200517021644
PID TTY STAT TIME COMMAND
27484 ? Sl 0:02 unicorn_rails master -c config/unicorn.rb -E production -D