出力を生成するコマンドに影響を与えずに、以下の出力を停止する方法を教えてください。


11

私はサーバーを実行しており、このサーバーのログはファイルではなくターミナルにログインします。このログを表示するために使用量を減らしたいと思います。

node server.js | less

ログを確認したいだけの場合は、Shift+キーを使用してFファイルの終わりに到達し、ログを監視し続けます。止めたいときはCTRL+ を使いますC

残念ながら、これによりサーバーも停止します。サーバーを停止することなく、ログの最後の監視を停止したいだけです。

これを行う方法?


1
サーバーをバックグラウンドで実行した状態で終了lessしてシェルプロンプトに戻りますか?または、最新の行を監視する代わりにログをスクロールできる通常の非追跡モードに戻りますか?nodeless
バイトコマンダー

CTRL + Cを押すと@ByteCommander。サーバーを実行し続け、スクロールできない通常の非フォローモードに戻したいです。
Ajay Kumar

回答:


16

Fモードを終了する方法が見つからないためless、回避策を使用する必要があります。たとえば、出力をtmpファイルに保存してから、代わりにそのtmpfileを監視します。

node server.js > tmpfile & less tmpfile

&なりnode.js、バックグラウンドで実行するコマンドを。つまり、less tmpfileすぐに起動し、tmpfileを追跡します。

に入るとless、を押しFてフォローモードに入ることができますが、Ctrl+ Cはサーバーを強制終了せず、フォローを停止するだけです。これで、好きなようにスクロールして、ヒットFしてフォローを再開できます。


13

通常、「Forward forever」モードを終了することは想定されていないようです。これは、マニュアルで+をman less押したときに入るモードの名前です。ShiftF

しかし、とにかくあなたが通常に戻る方法を少し汚いトリックを見つけました。ただし、コマンドが一時的にフリーズするため、中断することなく実行するサーバーに適しているかどうかはわかりません。


とにかく、ここにトリックがあります:

あなたはnode server.js | lessすでにやり始めてShift+ Fを押して「Forward forever」モードに入ったと思います。これlessで、キーを押しても反応しなくなりました。

この状態では、Ctrl+ Cを押してサーバープロセスを強制終了し、less後でを押して終了することができますQ(ただし、なんらかの理由で、ジョブリストでコマンドを停止されたプロセスのままにします- fg続行するには、実行して完全に実行する必要があります後に終了します)が、これは私たちが望むものではありません。

代わりに、Ctrl+ Zを押してコマンドを停止(「フリーズ」)し、シェルプロンプトに戻ることもできます。ここで、シェルコマンドfg( " f ore g round")をすばやく入力して、コマンドをフォアグラウンドで実行し続けます。nodeサーバープロセスもこの短時間の間一時停止されることに注意してください。これが許容できるかどうかを検討する必要があります。

これlessで、前と同じように、再びフォアグラウンドで実行されていますよね?はい、ただし魔法のように、「Forward forever」モードではなくなりました。矢印キーなどを使用して、上下にスクロールできます。

残念ながら、lessバッファの更新が完全に停止したようです。スクロールダウンできるのは、先にコマンドをフリーズした行までで、それ以上はスクロールできません。nodeサーバーがまだ実行されていると、私達はちょうど取得する必要がありますけれども、出力を生成しているless再びリフレッシュすること。

lessキーHを押しながらQ順に押すだけで、ヘルプ画面を開いて再び閉じるのが最も簡単な方法です。今、すべてが再び正常に動作しているようです。


ただし、最もクリーンな解決策は、おそらくterdonの回答に従い、出力を一時ファイルにリダイレクトしless、ファイルの監視に使用することです。


かなり見事な汚いハック。
TRiG 2017

私はこの答えが受け入れられたものよりも好きだと思います。を実行するの%ではなく、実行できることに注意してくださいfg。タイプするのが簡単/速いです。また、F(shift-f)はhqトリックをしなくても機能するようです。いいね!ログをフォローしているときに、できることctrl-z % Enter、できることを減らし、を押すことでフォローに戻ることができますF
JoL 2017

ところで、あなたはそれを汚いと呼ぶべきではありません。個人的には、これは他のソリューションよりもきれいに見えます。なぜなら、ここでは、ファイルシステムに一時ファイル(名前を考えて削除する必要がある)を散らかす必要がないため、特にlessのフォローを使用する場合に特にそうです。同時に複数の端末で機能します。
JoL 2017

2
私はソースを調べていませんが、TSTP信号が新しいデータの到着を待機していた読み取りシステムコールを中断するため、これはおそらく機能します。less0バイトを受け取り、出力が終了したと結論付けます。サーバーの一時停止を回避するには、新しいターミナルウィンドウを開きます。psプロセスのプロセスIDを実行して識別しlessます。次にと入力しkill -TSTP <PID>; kill -CONT <PID>ます。このようにして、入力中に信号が遅れることなく、連続して配信されます。
アレクシス2017

@alexisを使用する場合はkill、代わりにSIGINTを送信できます。その後CONT、を送信する必要はなく、less単にあなたを待っています。
muru

3

あなたの質問が言うように:

このサーバーは、ファイルではなくターミナルにログインします。

(temp)ログファイルを使用したくないと思います。おそらく、ログが巨大であるか、または何らかの理由でログが大きい可能性があります。


名前付きパイプ、fifoファイル。

私が思いついたのはnamed pipe filefifoファイルとしても知られているものを使用しています。このファイルは、ログをlessにパイプするためにのみ使用され、何も保存されません。

最初にfifo file

mkfifo mylog

サーバーを実行し、ログをこのファイルにリダイレクトします。

node server.js > mylog &

lessを使用してログを読み取ります(-fはlessにこの特別なファイルの読み取りを強制します)。

less -f mylog

今、あなたは使用することができますshift+ F従うこと、およびCTRL+ Cフォローを停止するが、サーバーがまだ実行されている、あなたが再び出力をたどることができますshift+ F


バックアップ計画:サーバーが停止した場合は、コマンド(node server.js > mylog &)をファイル(eg:server.shなど)に配置するだけで、node server.js > mylog &run:を実行する代わりにbash server.sh > mylog &、を実行しless -f mylogます。


ここで通常のファイルの代わりにfifoを使用する意味は何ですか?私が見ることができる唯一の利点は、ディスク領域を節約することですが、それがこのようなものに関連しているとは思えません。完了後もファイルは残っているため、手動で削除する必要があります。
terdon 2017

2
ここではFIFOを使用しないことをお勧めします。だれも(より多くの)ログデータを要求しなかったときにFIFOバッファがいっぱいになると、サーバープロセスが停止する可能性があるためです。ログファイルのサイズが問題になる場合は、適切なログファイルに加えて、実際に使用する必要がありますlogrotate
David Foerster 2017

@terdonあなたが唯一のポイントはディスクを保存することだと言ったように、私はOPが彼のログがディスクに保存されることを望んでいないと思いました。
Ravexina

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