ksh
ログファイルの表示に使用するスクリプトがありますtail -f
。
tail
プロセスを終了して基本スクリプトを実行し続けるにはどうすればよいですか?
私はこれをAIX 7.1で実行しています。
- - - - - - - - - - - - - - - - - - - - - - - - -編集 - - ----------------------- - -------
Gilesの答えに基づいて、スクリプトで次のことを試しました。
trap 'echo "tail process terminated!"' 2
tail -f mylog.log
trap - 2
これで、tailコマンドを実行した後にCtrl + Cを押すと、tailプロセスが終了し、スクリプトが実行され続けます。しかし、新しい問題は、Ctrl + Cをもう一度押すとスクリプトが終了しないことです。誰でも助けることができますか?
答え1
tail
スクリプトがコマンドをバックグラウンドに設定しないと、シェルはコマンドが終了するのを待ちますが、これは決して発生しません。
別の操作を実行する必要があり、tail
後でコマンドを終了したい場合は、次のことができます。
tail -f logfile &
tailpid=$!
...do some other stuff...
kill $tailpid
...carry on...
答え2
ポイントtail -f
は、明示的に終了するまで永久に実行されるため、終了をスケジュールする必要があります。
tail
プロセスの終了時期を決定するロジックがある場合は、プロセスIDを取得し、tail
必要に応じて終了をトリガーする準備をします。たとえば、1分後に終了するには、次のようにします。
tail -f file.log &
tail_pid=$!
sleep 60
kill $tail_pid
do_more_stuff
tail
ユーザーが+を押すCtrlとシェルスクリプトを終了しますが、終了しない場合はC、罠これ知能を知らせる信号。tail
空の文字列は子プロセスと呼び出しシェルがSIGINTを無視するため、トラップを空でない文字列(NULL以外の値、空白も可能)に設定する必要があります。
trap : INT # set a signal handler for SIGINT that does nothing
tail -f file.log
do_more_stuff # executed when tail is killed, e.g. by the user pressing Ctrl+C
trap - INT # reset SIGINT to killing the script