web-dev-qa-db-ja.com

`Ctrl + c`を使わずに` tail -f`モードを終了する方法は?

私がする時 tail -f filename、使用せずにモードを終了する方法Ctrl+cプロセスを強制終了しますか?

qtopのように、通常の方法で終了します。

プロセスを殺すことは何かをやめるための良い方法ではないと私は感じているので、私は質問に興味があります。

23
Key Shang

コメントで述べたように、 Ctrl-C tailプロセスを強制終了しません。これは、SIGTERMまたはSIGKILLシグナル(悪名高い-9...)のいずれかを送信することによって行われます。転送モードを終了して終了するようにtailに指示するSIGINTを送信するだけです。

参考までに、これらはより良いツールです:

less +F filename

lessでは、 Ctrl-C 転送モードを終了してファイルをスクロールし、次に F 再び転送モードに戻ります。

less +Ftail -f のより良い代替案として多くの人から支持されていることに注意してください。 2つのツールの違いと注意事項については、次の回答をお読みください。 `tail + f`は` less + F`よりも効率的ですか?

47
dr_

私が欲しいのは、一番上のqのように、通常の方法で終了することです。

それは ControlC :)

プロセスを殺すことは何かをやめるための良い方法ではないと私は感じているので、私は質問に興味があります。

^CControlC[〜#〜] sigint [〜#〜] をプロセスに送信します。これは次のように定義されます:

SIGINTシグナルは、ユーザーがプロセスを中断したいときに、制御端末によってプロセスに送信されます。

それがまさにあなたがここでしたいことです、割り込みtailです。あなたがやろうとしていることを成し遂げる方法は他にありません(「うまく」終了します)。他の答えは、他の方法でtailを停止する手段を提供しますが、それよりも優れています。

^Cを押すと、Linuxでタスクを中断しようとします-これは完全に正常であり、そのプロセスが何かの途中にあり、それを終了させない場合、それは唯一「唯一の問題」です。 「良くない」副作用は、そのプロセスの残り物です。例として、makeコマンドの途中にある^Cは、部分的にコンパイルされたソフトウェアを残しますが、それで問題ありません。makeをさらに実行すると、クリーンアップ/残った場所から再開しますオフ。

14
Josh

tail -fファイル名、使用せずにモードを終了する方法 Ctrl c プロセスを終了する

それはできません。おそらくあなたはtail -f somefile | less

の Ctrl c ttyサブシステム(およびシェル)によって解釈され、SIGINTシグナルを送信します( signal(7) および pty(7) ...を参照)。 )。 tty demystified を参照してください。

12

これはうまくいき、あなたの質問に答えますが、特に満足できる解決策ではありません。

timeout 15s tail -f /var/log/messages

これにより、コマンドが15秒間実行され、^Cを押さなくても強制終了されます。

6
Criggie

発行中

echo tail -n 1 -f <filename>

私はそれがテールプロセスを終了することを100%確信していませんが私にとってはうまくいきます。

0

答えは状況によって異なります。エレガントにtail -fを終了するには、トリガーが必要です。ある時点で終了するタスクの出力を監視しようとしていると仮定します-これがトリガーになる可能性があります。

task >& filename.log &
task_pid=$!
tail -f filename.log &
tail_pid=$!
while [ 1 ]
do
    # -0 is a special "poke" signal - "are you around?"
    kill -0 $task_pid
    if [ $? -eq 0 ]
    then
        # Original task is still alive.
        sleep 2
        continue
    fi
    kill -TERM $tail_pid
    break
done

私は過去に同様のアイデアを使用しました。

楽しい。

0
navjit.brar