- Published on
Bash 現在のインタラクティブシェルが何階層深いかを確認する
- Authors
- Name
- Shou Arisaka / 有坂翔
Linuxパソコン・サーバーのBashプログラミング言語(スクリプティング言語)上のコマンドラインにおいて、現在のインタラクティブシェルが何階層深いかを確認する方法について紹介します。
先日「Bashインタラクティブシェルを多重起動せずに再起動するには」という記事を書きました。そこでは、exec bash
コマンドを使うことで、現在のインタラクティブシェルを新しいものにリフレッシュできるということでしたが、色々いじっているうちに、無視できないディスユーザビリティを発見してしまいました。
そこでexec bash
を使用せずに、あまりBashを多重起動しすぎないようにするためにはどうしたらいいかを考えてみました。
カレントのターミナルはttyやptsで表示されますが、これをps f
で表すと、ヒエラルキーの表示で何段階bashの階層があるかなどを簡単に確認することができます。
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
21929 21930 21930 21929 tty19 0 Sl 1000 0:00 /mnt/c/Program Files/ConEmu/ConEmu/wsl/wslbridge-backend --check-version=0.2.5-dev -363252 -063253 -163254 -k6A72EFE6177C0FE62CC8A91F3E1369AC32E21930 21934 21934 21934 pts/19 0 Ss 1000 0:01 \_ bash -l -i
21934 24318 24318 21934 pts/19 0 S 1000 0:01 \_ bash
24318 25004 25004 21934 pts/19 0 S 1000 0:01 \_ bash
25004 25794 25794 21934 pts/19 0 S 1000 0:01 \_ bash
25794 26603 26603 21934 pts/19 0 R 1000 0:00 \_ ps fjx
このようにbashが三段多重起動されていることが確認できます。
これを応用して、以下のようなスクリプトを書いてみました。
check-bash-depth(){
tty="$( tty | sed -Ee 's/\/dev\/(pts|tty)\/(.*)/\2/g' )" ; ps fx -o tty,pid,stat,command,%cpu,%mem --sort=tty | ag "^(pts|tty)/?${tty}\s" | tee
}
yuis ASUS /mnt/c/pg$ check-bash-depth
pts/11 6135 Ss \_ bash -l -i 0.0 0.0
pts/11 4006 R \_ ps fx -o tty,pid,st 0.0 0.0
pts/11 4007 S \_ ag ^(pts|tty)/?11\s 0.0 0.0
pts/11 4009 S | \_ sh -c git confi 0.0 0.0
pts/11 4010 R | \_ git config 0.0 0.0
pts/11 4008 S \_ tee 0.0 0.0
check-bash-depth
を実行することで、カレントのターミナルがどれくらいBashインタラクティブシェルの階層を持っているのかがわかるようにしました。これで、カレントのログインシェルをログアウトしない程度に多重起動された中間層のBashをexitし、CPU使用率を抑えつつ作業していくことができます。
表示の通り、カレントのターミナルの全てのプロセスが表示されるわけなので、単にBashの階層を知りたいというだけでなく、カレントのターミナルの全てのインタラクティブシェルの全てのプロセスを確認したい、という場合にも使えます。