まっすぐ飛び込むには:
while true; do
#--- MENU LOGIC HERE, stick response in $MENUEXIT
#----Deal with responses here
if [ $S1 == $MENUEXIT ];
then
tail -f /path-to-file
else
sleep 2
fi
done
私はこれをできるだけ単純に保つように努めました。もっと必要な場合は、私に知らせてください。
基本的にはメニューをループ状に貼り付けているので、ユーザー入力が間違っていたり、コマンドが終了したりすると、メニューを再表示することになります。
tailコマンドを追加するまでは、問題なく動作しました。
メニューからtailオプションを選択すると、tailコマンドは正常に起動しますが、Ctrl+Cを押すと、tailを終了してメニューを表示したいのですが、代わりにtailとスクリプトの両方を終了します。
コンティニュー/トラップなど色々試してみましたが、レンガの壁にぶつかって助けてください!
端末からSIGINT
(CtrlC)やSIGSTOP
(CtrlZ)のような信号を送信すると、その信号はフォアグラウンドプロセスグループに送信されます。つまり、フォアグラウンドジョブ(スクリプト)と、フォアグラウンド(コマンド)にある子プロセスで構成されるグループです。これにより、これらすべてのプロセスが終了します(または、シグナルを処理することによって実行することは何でも実行します)。次のコマンドを使用して信号を送信することにより、違いをテストできます。tail
kill
1つの端末で、このスクリプトを実行します(test
次のコマンドで呼び出します)。
#! /bin/bash
while true
do
if [[ $1 = a ]]
then
yes
else
echo no
sleep 2
fi
done
別の方法では、次のコマンドを実行します。
pstree -ps $(pgrep -f test)
pkill -f test
pstree -ps $(pgrep -f yes)
コマンドの出力は次のようになります。
init(1)───lightdm(1032)───lightdm(1154)───init(1173)───x-terminal-emul(17009)───bash(24262)───test.sh(24996)───yes(24997)
# No output for pkill
init(1)───lightdm(1032)───lightdm(1154)───init(1173)───yes(24997)
(実際の数とプログラムは異なる場合がありますが、最初のinitには常にpid 1が含まれます。)
ご覧のとおり、yes
コマンドは強制終了されずinit
、親が強制終了されたために接続されました。それはまだy
最初の端末で陽気にsを印刷しています。だからそれをで殺しpkill -f yes
ます。ここで、1つの変更を加えて、実験を繰り返します。の代わりにpkill -f test
、次のようにします。
kill -INT -25165
# Use the pid of test.sh given in parentheses in the output of pstree
# instead of 25165
先頭のに注意してください-
。Linuxでは、kill
コマンドの-25165
場合、リーダーがpidを持つプロセスグループ25165
です。したがって、このコマンドは、端末から割り込みを送信するのと同じです。
もちろん、正確な動作は、TTY、ログインシェルなどの構成によって異なります。これは私の理解の範囲内です。参考文献:
私は提案します:
tail
バックグラウンドに送信する例:
#! /bin/bash
kill_jobs ()
{
kill %1
}
while true
do
if [[ $1 = "a" ]]
then
trap kill_jobs INT
tail -f /var/log/syslog &
wait %%
shift #You don't need to shift, I just didn't want loop tail on this example
trap - INT
else
echo some output
sleep 2
fi
done
これは、トラップにさまざまな関数を使用し、それぞれが独自のクリーンアップ作業を行うことで、非常に強力になる可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加