プログラミング

Bash psコマンドを実行しているコマンドがpsの出力に入らないようにする

psコマンドを実行すると、psコマンド自体とそれをパイプしているコマンドまで出力に入ってきてしまいます。

例えば、カレントのシェルでnode.jsがバッググラウンドで動いているかもしれないのでそれを確認したい、という場合。

tty="$( tty | ag -o '\d+' )" ; ps aux | ag "(tty|pts)/${tty}" | awk '!/\s(Ss)\s/' 

これは以下のような出力になります。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_54f84c34-ab84-4f59-9f49-095f04a82ed6.png

yuis     17361  0.0  0.0 1175236 26304 pts/8   Sl   00:49   0:01 node tmp.js
yuis     18990  0.0  0.0 873500 26608 pts/8    Sl   01:21   0:00 node tmp.js
yuis     20377  0.0  0.0 874012 26656 pts/8    Sl   01:48   0:00 node tmp.js
yuis     24704  0.0  0.0  16676  1868 pts/8    R    02:44   0:00 ps aux
yuis     24705  0.0  0.0  11416  1080 pts/8    R    02:44   0:00 ag (tty|pts)/8
yuis     24706  0.0  0.0  25676  1824 pts/8    R    02:44   0:00 bash -l -i

この出力のうち、重要な部分は以下のみですね。

yuis     17361  0.0  0.0 1175236 26304 pts/8   Sl   00:49   0:01 node tmp.js
yuis     18990  0.0  0.0 873500 26608 pts/8    Sl   01:21   0:00 node tmp.js
yuis     20377  0.0  0.0 874012 26656 pts/8    Sl   01:48   0:00 node tmp.js

このような出力にしたい場合、以下のようにします。
ps auxは出力がコマンドの開始時刻順にソートされていますので、sed '/ps aux/,+1 d'ps auxを含む行とそれ以降の行を削除してしまえばよいということになります。

text processing – Remove line containing certain string and the following line – Unix & Linux Stack Exchange

tty="$( tty | ag -o '\d+' )" ; ps aux | ag "(tty|pts)/${tty}" | awk '!/\s(Ss)\s/' | sed '/ps aux/,+1 d'

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_847ca387-337d-462e-9dcd-8535dd696acd.png