少ない中断で少ない


13

私はしばしばプログラム出力をより少ないパイプにパイプします。例えば

produce_output | less

produce_output大量の出力が生成されるまで、これはうまく機能します。ファイルの奥深くにあるテキストを検索すると、レポートが少なくなります

Calculating line numbers... (interrupt to abort)

Control + Cで中断すると、killが実行されproduce_output、それ以上の出力が生成されなくなります。lessに割り込みを送信する方法はありますproduce_outputか?

私はを使用できることを知ってkill -INT less_processいますが、より良い解決策があるに違いないと思います。

回答:


15

通常、パイプライン内のすべてのプロセスは同じプロセスグループで実行され、すべてのプロセスが信号を受信します。別のpgrpでsetsid foo | less実行するために使用できますfoo


OPによって提起された問題を考えると、少ない中断の方法としてCTRL + Cを使用する決定は非常に残念なようです。この特定の信号が選択された理由を知っていますか?他の信号はそれほど問題になりませんか?
ピョートルドブロゴスト

@PiotrDobrogost:他にどんなシグナルを提案しますか?専用のキーボードショートカットを持つものは多くありません。SIGINT(Ctrl-C)とSIGQUIT(Ctrl- \)のみがあり、後者は単に割り込みではなく、プログラムをすぐに終了するためのものです。残りはを介してのみ利用可能ですkill
user1686

この問題は、信号を使用して中断を少なくすることによって引き起こされるようです。代わりに、それが通常のキー/ショートカットであれば、そもそも問題はありません。しかし、シグナルの必要性は、プロセスがselectファイル/パイプと端末の両方からの入力を同時に待つために使用できないという事実から来ると思います。
ピョートルドブロゴスト

@PiotrDobrogost:できる、それがF(フォロー)モードの仕組みです。パイプとttyは同じ方法でポーリング可能です。
user1686

なぜフォローモードが機能するのだと思いますか?イベントの流れは、シェルがCTRL + Cを取得し、SIGINTシグナルをlessに送信し、キーボード/端末をリッスンせずにこのシグナルを非同期に取得することだと思います。
ピョートルドブロゴスト

9

で行番号を無効にできます

   -n or --line-numbers

オプション。

produce_output | less -n

-1:OPの問題を解決できますが、OPの実際の質問に答えることはありません(つまり、プロセスを中断します)。
goldPseudo

2
申し訳ありませんが、望ましくない機能から始めて、スイッチで無効にできる機能を無効にする信号を送信しようとするのは回避策であり、解決策ではありません。もちろん、@ grawityのソリューションは素晴らしい(そして私は賛成票を投じた)が、やってくる:必要のないタスク(行カウント)を中断する信号を送信できるように別のグループで最初のプロセスを開始するのは本当に少しも仕事いっぱい。
マッテオ

1
これは、私の質問で提起した問題の公正な解決策です。ただし、割り込みは、少ない行数でカウントするだけではなく、たとえば、長い検索も中断します。したがって、@ grawityのソリューションは、割り込みの使用をより少なくカバーするため、推奨されます。質問でこれをより明確に対処しないのは悪いことです!
エドマクマン

@EdMcMan確かに私は重力の解決策にも賛成票を投じたので、いつでも役立つ何か新しいことを学んでうれしいです。
マッテオ

0

大量の出力を処理する場合、出力をファイルに送信して使用tail -fまたはless +F監視すると非常に役立つことがわかりました。例:

produce_output > out 2>&1 & less +F out

2>&1構文は次のとおりにstdoutとstderr、外出先の両方のことを確実にするoutだけしたい場合は削除---が標準出力ファイルに行くことに。この方法では、出力を生成するプログラムをいじることなく、さまざまな方法で(別のマシンからでも)出力を検査できます。

2>&1bash固有の場合があることに注意してください(わかりません)。出力ファイル用に十分なディスク容量があることを確認してください:-)


テールは、単に(例えば、彼はファイル内を検索する必要があります)エドは彼があまり対話的に使用していることを指定し、あなたのファイルが表示されます
マッテオ

2>&1POSIX、裸>&はバシズムです。
user1686

FWIW、2>&1はまた、などのWindows XP、7、2008、上で動作します
jftuga

@Matteo:はい、less +F私の例で使用すべきでした。答えを更新しました。
ジュレニー

1
@Matteo:行のカウントは、データの生成less +F時にless +F処理されるため、同じ問題ではありません。私が与えた例には、元々投稿されたものと同じ問題はありませ:ctrl + cは中断しませんprocess_output。1は、「フォロー」機能の世話をしない場合は、1を実行することができproduce_output > out 2>&1、その後、less out。問題produce_output | lessは、何かがパイプを壊した場合(たとえば、誤ってから 'q'にヒットした場合less)、produce_output(特別なSIGPIPE処理なしで)死ぬことです。
ジュレニー

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