私は実際にこの種のことがどのように行われるかをここの別の答えで正確に示しています。その答えは、2つのログがバックグラウンドプロセスによって維持されていることを確認するための質問に対するものだったので、10で実証しました。
デモスクリプト
cat <<-\DEMO >|${s=/tmp/script}
printf 'tty is %s\nparent pid is %s\npid is pid=%s\n' \
"$(tty)" "$PPID" "$$"
exec 1>&2 ; nums=$(seq 0 9)
rm ${files=$(printf "/tmp/file%s\n" $nums)}
for n in $nums ; do { for f in $files ; do
echo "Line $n" >>"$f" ; done
sleep 1 ; } ; done
#END
DEMO
デモを実行
s=/tmp/script ;chmod +x $s ;info="$(($s &)2>&- &)"
echo "$info" ; pid="${info##*=}" ; echo
while ps -p $pid >/dev/null ; do sleep 3 ; done
for f in /tmp/file[0-9] ; do
printf 'path : %s\tline count : %s\n' \
$f $(<$f wc -l)
done
出力:
tty is not a tty
parent pid is 1
pid is 12123
path : /tmp/file0 line count : 10
path : /tmp/file1 line count : 10
path : /tmp/file2 line count : 10
path : /tmp/file3 line count : 10
path : /tmp/file4 line count : 10
path : /tmp/file5 line count : 10
path : /tmp/file6 line count : 10
path : /tmp/file7 line count : 10
path : /tmp/file8 line count : 10
path : /tmp/file9 line count : 10
上記は実証します。これは、構築し、名前のスクリプトを実行し/tmp/script
、 chmod
「Sの実行としてそれを、そして、それを実行&background
します&backgrounded ( subshell )
。
スクリプトは、rms /tmp/file0-9
10個のファイルとechoes
1秒ごとに10個のファイルすべてへの1行です。$info
不名誉なプロセスからいくつかをキャプチャし、キャプチャ$(command substitution). While ps
した静止レポートを介してそれを提示します。$pid
それはまだ実行中であることがわかっているのでsleep.
、完了すると、10個のファイルすべての行が次のようにカウントされます。wc.
この方法でプロセスを呼び出した後、元の親プロセスを自由に閉じることができ、追跡は継続されます-事実上、取り消されます。これはまた、従来のwait
コマンドを使用できないことを意味しますが、ps
の戻りを待機することは、いずれの場合もより堅牢になるはずです。
言及する価値は、私が思うに、プロセスが実際に最初にで呼び出されていることである$(command substitution)
とprintfs
私は$info
、私はそれを効果的に制御することができますので、私が欲しいです。しかし、exec 1>&2
それが(と同じサブシェルで閉じられる2>&-
)でターミナル出力をドロップするとすぐに、プロセスはエスケープし、もう一方の端でそれを待つ必要があります。特に、入力パイプを処理するためにそれを使用する場合、すべてのリダイレクトとプロセスリーダーに心を留めることができる限り、両方の世界の中で最高です。
その他はすべて、ここでのデモ用です。これを実行するために必要なのは、最上位のスクリプトと次のとおりです。
info="$(($script_path &)2>&- &)"
注:これは、私が実際にデモンストレーションしたいものだけをターミナルに出力します。で述べたように、$PPID,
このプロセスは端末によって否認され、その直接の子です$PID 1.
これらの2つを同時に実行して待機する場合はps
、両方のPIDを渡して待機します。