「Ctrl + c」を使用せずに「tail -f」モードを終了するにはどうすればよいですか?


22

私がするとき、プロセスを殺すためにtail -f filename使用せずにモードを終了Ctrl+cする方法は?

私が欲しいのと同様に、終了する通常の方法であるqの中でtop

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


23
tailインタラクティブではありません。コマンドを使用しません。
muru

5
SIGTERM(デフォルト)とSIGKILLによるプロセスの強制終了にも違いがあります。SIGTERMは停止するプロセスを「要求」します。このシグナルはプログラムで処理できます。一方、SIGKILLは実際にプロセスを強制終了します。詳細man signalはこちら
mrc02_kr

9
この質問の前提は不完全です。その特殊文字は、あなたが考えている方法でプロセスを「殺す」ことはありませkillまたはterminateシグナルではなく、割り込みシグナルを送信します。
JdeBP

6
tail心配することなく、中断したり殺したりすることは完全に合理的です。あなたが代わりをしたい場合でも、検討しmost、文書化の下で、確かにShiftキー+ Fで開始モードを、「従う」持っていると、きれいQ.で終了することができます
トビースパイツ

4
ここでの問題は、「プロセスを殺すことは何かを終了する良い方法ではない」というあなたの認識です。^ Cをプロセスに送信すること、「私はあなたで終わったので止めてほしい」と言う一つの方法です。それはある Linuxでは、端末のプロセスを終了する「デフォルト」の方法。長時間実行されているプロセスを終了することを選択している場合、それを停止するために選択した影響は混乱を招く可能性がありますが、そうでtail -fはありません:)
ジョシュ

回答:


46

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

参考までに、これらはより優れたツールです。

less +F filename

less、を押しCtrl-Cて転送モードを終了し、ファイルをスクロールしてから、を押しFて転送モードに戻ります。

less +F代わるものとして多くの人が提唱しているtail -fことに注意してください。2つのツールの違いと警告については、この答えを読んでください:「tail -f」は「less + F」よりも効率的ですか?


7
オフトピック。OPは、「転送モードを終了してファイルをスクロールする」ことを要求しませんでした。むしろ、OPにCtrl + Cを使用せずに-f尾を終了する方法を尋ねた
fpmurphy

6
@ fpmurphy1 OPの質問の前提が間違っている(tailCTRL-Cで殺されず、対話的でない)ことを考えると、私の答えは適切すぎると思います。
DR01

11
@ fpmurphy1 OPを文字通り「はい」にすると、それはトピックから外れますが、誤解に対処すると同時に、OPが実際に達成しようとしていたこと、つまり実際の質問に答える教育的な答えを好みます。
マリオDS

15
「Ctrl-Cはテールプロセスを強制終了しません」 -はい。または少なくとも同じくらいkill <pid>。ほとんどのプログラムでは、Ctrl-C(= SIGINTSIGTERMと(ある程度)の間に実際の違いはありませんSIGKILL。3つすべての既定のアクションは、exit()呼び出されたかのように、単にプロセスを終了することですSIGKILL。ただし、の場合、関連付けられているユーザーモードコードexit()は一切呼び出されません(atexit()クリーンアップなどは行われません)。Ctrl-CおよびSIGTERMは、特に、プログラムが明示的にいずれかをキャッチして処理しない限り、完全に同一です。GNU tailはサポートしていません。
marcelm

4
@marcelmプロセスの終了は、exit()呼び出されるのと同じではありません。ハンドラーexit()を実行し、atexit()開いているstdioファイルをクリーンアップします(最も重要なのは、出力バッファーをフラッシュする)。SIGINTハンドラは、この操作を行うことができますが、ほとんどのプログラムは気にしないでください。かどうかtailはわかりません。
バーマー

14

私が望むのは、トップのqのような、通常の終了方法です。

それはControlC:)

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

^CControlC)プロセスにSIGINTを送信します。これは次のように定義されます。

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

それはまさにあなたがここでやりたいこと、割り込みtailです。あなたがやろうとしていることを達成する他の方法はありません(「きちんと」尻尾をやめる)、他の答えtailは他の方法で停止する手段を提供しますが、それらは良くありません。

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


2
実際、このmake例は、.DELETE_ON_ERROR:Makefileに常に書き込む理由を思い出させるものです。Makeは、コマンドの1つがシグナルを受信したことを知ると、部分的に書き込まれた中間ファイルを削除します。
トビー・スペイト

SIGINTTobyの.DELETE_ON_ERROR:例に示されているように、プロセスは終了前にトラップしてクリーンアップを実行できます。
追って通知があるまで一時停止します。

1
はい、SIGINTをトラップする能力は、まさに@Arthurが望んでいることだと言った理由です。尾に「素敵」である必要はありません、あなたはそれで感情を傷つけることはありません^C:)
ジョシュ

12

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

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

Ctrl cTTYサブシステムによって解釈(およびシェルによって)と送信されるSIGINT信号を(参照信号(7)PTY(7) ...)。tty demystifiedを参照してください。


6

これで問題は解決しますが、特に満足のいく解決策ではありません。

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

これにより、コマンドが15秒間実行されてから、キーを押さずに終了します。 ^C


5
ええ、それでコンピュータtailがシャットダウンしているのは実行中です。それでも、あなたは間違っていないと思います。
アーロン

5
tailSIGINTで終了するよりもSIGTERM で終了する方が良い方法はありますか?
ドミトリーグリゴリエフ

1
@DmitryGrigoryevあなたは完全に正しい-それは良くない。しかし、実際にはあまり使用されていませんが、この回答はOPの質問に直接答えます。ただし、Controlを押すためのメニュー選択と制御を解放するための2番目のメニュー選択(Dell c5220ブレード)を必要とするDell DRAC Javaアプリを使用する場合、タイムアウトなどを使用してpingなどを終了しました
Criggie

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

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

楽しい。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.