すべての子プロセス情報を次の形式で記録するbashスクリプトを作成しようとしていますが、プロセスに6つ以上の子がある場合にのみ情報を記録する必要があります。
PID | PPID | 評価 |
---|---|---|
10 | 9 | 1(子供用) |
9 | 8 | 2(上位を示す) |
8 | 7 | 3(祖父母用) |
Pstree -ps 10 should display:
dummy1---dummy2---dummy3---dummy4---dummy5---dummy6---dummy7
上記の方法で仮想プロセスをどのように起動できますか?
正直なところ、私はbashスクリプトについて何も知らず、私ができる唯一のことは特定のユーザーのPIDを表示することです。
while read -r processId;
do
echo $processId
done <<< "$(ps -u $USER -o pid)"
各PIDを繰り返して6つ以上のサブアイテムがあることを確認する必要がありますが、その前に6つのサブプロセスを手動でトリガーしてスクリプトを起動してテストしようとしています。
答え1
7つのサブアイテムでスクリプトを起動するには、次のように使用できます。
#!/bin/bash
if [[ "$#" -ne 1 ]]; then
set -- 7
fi
if [[ "$1" -gt 2 ]]; then
"$0" "$(($1 - 1))"
else
sleep 120
fi
あるいはもう少し簡潔に言えば、
#!/bin/bash
[[ "$#" -ne 1 ]] && set -- 7
[[ $1 -gt 2 ]] && $0 $(($1 - 1)) || sleep 120
引数が指定されていない場合、または引数が多すぎる場合は、引数を7に設定します。次に、引数が2より大きい場合は常に引数を減らし、同じスクリプトを実行するサブプロセスを開始します。パラメータが2に達すると、2分間スリープモードが実行されます。 (最後のスクリプトとsleep
合計もそれぞれ1つとして計算されるため、2つに制限されます。)
$ ./dummy &
$ pstree -p 1800554
dummy(1800554)───dummy(1800561)───dummy(1800563)───dummy(1800566)───dummy(1800567)───dummy(1800570)───sleep(1800572)
パラメーターを変更して、異なる数の子孫を要求できます。
$ ./dummy 6 &
これは、各「世代」で複数の子を開始するように拡張できます。
#!/bin/bash
[[ "$#" -ne 2 ]] && set -- 1 7
for (( i = 0; i < $1; i++ )); do
[[ $2 -gt 2 ]] && $0 $1 $(($2 - 1)) || sleep 120 &
done
wait
次のように実行
./dummy 3 2 &
それぞれ3人の子供を持つ2つの世代を始めます。