さて、次のような構造を持つ単純なスクリプトがあります。無期限に実行されるサブプロセスがあります。現時点では、ユーザーがプロセスを手動で終了したときにのみ停止します。電話を切らずにユーザーの入力を聞く方法があるかどうか疑問に思いますread
。つまり、子プロセスの実行中にユーザーが\n
端末に「quit」と入力するかどうかをバックグラウンドで確認します。
...
if [[ option = "3" ]]; then
while [2 -lt 4]; #THIS IS WHERE I WANT TO CHANGE TO LISTENING FOR INPUT TO QUIT
#Some sub process that continues to run
done
fi
....
助けてくれてありがとう!表現が悪いと申し訳ありません。この質問をよりよく説明する方法はありません。ブレーンストーミングの試みについては、while
条件で変数を使用し、「終了」になるまでこれを行うことができることを知っていますが、その変数を入力に設定することは私が失った場所です。
答え1
を使用してバックグラウンドでプロセスを実行&
し、read
ユーザーのバックグラウンドで実行し、どちらかが完了するのを待つこともできます。あなたは次のように終わります
mylongrunningcommand &
pid1=$!
echo "enter quit to stop"
while read reply && [ quit != "$reply" ]
do :
done </dev/stdin &
pid2=$!
wait -n
echo "got quit or command done"
kill -9 $pid1 $pid2
wait
read
ループ内にあるので、「quit」を数回入力してみることができます。背景のため、標準入力をリダイレクトする必要があります。バックグラウンドジョブのいずれかが完了すると返されwait -n
、どのジョブが完了したかわからないため、killは両方のジョブのプロセスIDを終了します。
上記のコードは、終了したプロセスに対してbashからいくつかのメッセージを生成します。これを抑制するには、最後の2行を次に置き換えます。
exec 3>&2 2>/dev/null
kill -9 $pid1 $pid2
wait
exec 2>&3 3>&-
それから一時的にstderrが/dev/null
。