出力の下のBashプロンプト-バックグラウンドログテール


15

私は以前、Linux上で実行されている製品の1つを管理するためにカスタマイズされたシェルを使用していた会社で働いていましたが、このシェルの主要な機能を複製したいと考えています。

すべての作業はバックグラウンドプロセスで行われ、ログからの出力はすべての接続ユーザーに表示されました。

ログはシェルのバックグラウンドで終わり、プロンプト行は常に完全に下部に留まります。

例えば

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #

私がbashでこれをやろうとしたのは、ユーザーの.bashrcファイルでデタッチされたテールを開始することでしたが、コマンドからの出力がstdoutに送信されると、bashプロンプトの下に入力されます

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3

そして、ユーザーはEnterキーを押すかCtrlC、クリーンなプロンプト行を表示する必要があります。

プロンプトを常に出力の一番下にジャンプさせる方法についてのアイデアがありません。運が悪いので間違った用語を使用してGoogleで何かを見つけていると思います-誰もこれを行う方法を知っていますかバッシュで?


1
出力を即座に更新するか、新しいプロンプトが表示されますか?
ahilsend

即座に、したがって、「tail -f」を実行するのと可能な限り同じですが、下部にプロンプ​​トが表示されます。
iamacarpet

何がに起こるtail -f、あなたのバックグラウンド・プロセスが積極的にその出力を送信している場合は特に、かなりの量の出力を持つコマンドを入力したときに出力し、プロンプトやコマンドの出力?
追って通知があるまで一時停止します。

彼らの場合、実行されるコマンドは、それ自体ではなく、バックグラウンドプロセスを介した出力のみを引き起こしたため、問題ではありませんでした。この場合、目的の効果が得られるソリューションが得られたら、実装ごとに出力が混合されるのがどれほど悪いかを試してみることになると思います。
iamacarpet

1
次に、screenまたはtmuxを使用することを強く支持します。出力が混在したり、画面スペースを奪い合ったりすることはありません。ウィンドウのサイズを変更(分割を移動)し、個別にスクロールできます。ヘッダー/フッター/ステータス行が「ヘビー」であることに異議がある場合、それを設定する機能があります。再発明された車輪はありません。
追って通知があるまで一時停止します。

回答:


1

以下は、tmuxまたはscreenまたは他のプログラムを使用せずに、必要なことを行います。プロンプトを下部に保持します。「/ var / log / cron」を必要なファイルに置き換えます。

#!/bin/bash 
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do 
  tput sc
  printf "\e[1;${L1}r\e[${L1};${C}f" 
  echo; echo ${line}
  printf "\e[1;${L}r" && tput rc
done

これの鍵は、端末のANSI制御文字です。特に、新しいスクロール可能な領域を設定する「\ e [x; y」ステートメント。そのため、ログファイルの各行が読み取られると、ウィンドウの一番下の行がスクロール可能領域から除外され、ログファイルの行が挿入されてから、一番下が再び追加されます。


おかげで、マイケルは、それは美しく動作します =]-たくさんのログ行がスクロールしているときに、あなたが入力しているという時折問題があります。コンソール行のすべてのテキストをバックスペースできません忙しいApacheログ)が、私はそれを使用したいもののために、それは問題ではないはずです。
iamacarpet

@iamacarpet素晴らしい。それがあなたのために働くことを嬉しく思います。
マイケルマルティネス

11

答えはscreenまたはtmuxが使用されている

画面を使用してそのように設定する方法を説明します

1)apt-get install screenUbuntu / Debianまたはyum install screenRedHat派生のいずれかを使用して画面をインストールします 。

2) screen -S shell_and_logs

3)次にCtrl+を押しa、次にS(大文字のS)を押します。
横画面が表示されます

4)Ctrl+を押しaて、TAB
これを押すと、2番目の分割ウィンドウにジャンプします。

5)ここに別のウィンドウを作成して、Ctrl+ を押してコマンドプロンプトを表示しa、キーを放してからを押すc

6)あなたは押すことにより、第2 windoのサイズを変更することができますCtrl+ aその後、入力し:resizeた後に Lines:表示されます。表示する行数を入力します。

7)最後に、あなたがでウィンドウを切り替えることができます Ctrl+はa続きますTAB

以下の例を参照してください


val0x00ffに感謝します-私はアイデアが好きです、それは仕事を終わらせます-しかし、それは問題のシステムが提供した経験ほどきれいに見えません。経験の浅いユーザーにとって、それはそれほど透明ではありません-それは明らかに、あなたのメインシェルがあなたを更新し続けているように感じるのではなく、明らかに別のシェルです。
iamacarpet

@iamacarpetこれtail -F /var/log/messages &は、ログインの失敗が発見されたときや、一部のサービスに問題があるときなど、何かが変わったときにメッセージを表示する別の方法です。ただし、これは対話型シェルを混乱させるため、理想的ではありません。
バレンティンバジラミ

はい、それはまさに私が求めていたものです-インタラクティブなシェルを台無しにすることなくそれを行う方法-それは彼らが会社のシェルで何とかしたので-しかし、それは最初からシェルを書く必要がないのは良いことですそれを達成するために。
iamacarpet

1
@iamacarpetそこ以外の他のツールの集まりですscreenし、tmuxそれがこれを行うことができます-例えばBSD系の一部が同梱さwindowコマンド。選択肢がありますが、柔軟性があるため、カスタムシェルまたは他のオプションよりもこのソリューションをお勧めします。エンドユーザーにはそれほど透過的ではないかもしれませんが、実際には違いを知らないため、パワーユーザー/システム管理者はによって提供される追加の柔軟性を使用できますscreen
voretaq7

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"スクリプトに入れて、必要なときに実行します。#bash @ irc.freenode.orgでこれを行ってくれたgeirhaに感謝します
Valentin Bajrami
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.