Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック第2章2節練習問題その1

練習2.2.a プロセスを知る

sleep 100 | sleep 100 | sleep 100| sleep 100 | sleep 100 &

 を実行した後、sleep プロセスの PID がすべて異なることを確認する問題だった。ps で PID を出力した後パイプで awk につなぎ、

ps | awk '/sleep$/'

とやったが、すべて異なることを確認するなら直接出力しなくても行数カウントをすればよかった。行数が多いとこのやり方では明らかに破綻する。

ps | awk '$4=="sleep"{a[$1]="";b++}END{print length(a),b}'

とすればいくつ sleep があるかわからない状況にも対応できる。sleep の PID が一致すればその分 a の長さが短くなる。bで sleep の個数を数えている。

この問題を解いているときに、sleep 100 | ... & を実行した後 ps を単体で実行し、そのあとに

ps | awk '/sleep$/'

を実行すると

[1]+  終了                  sleep 100 | sleep 100 | sleep 100 | sleep 100 | sleep 100

という出力が得られた。そんなに時間たってた気がしないのだが、なんだったんだろうか。

 

練習2.2.b プロセスの親子関係を知る

上の練習問題と同じ sleep コマンドを実行して、今度は pstree -T の出力から今使っている bash とその下の子プロセスの部分を抽出せよという問題だった。

実行してみると

init───init───bash─┬─pstree
                        └─5*[sleep]

という出力が得られたが、本に載っているものとはずいぶんと違う。本にはなんとかdaemon だとか、もっといろいろ載っていた。こんなに簡素ではない。wsl2 でやっているからなのだろうか。よくわからない。