画面(プログラム)出力をファイルに保存


130

の出力全体を保存する必要があります Screenのファイル後ですべてのコンテンツを確認ます。

その理由は、シリアルポートを介してフラッシュメモリをダンプし、Screenを使用してそれとやり取りするためです。メモリ構造を確認するためにファイルに保存したいと思います。

私はもう試した:

$: screen /dev/ttyUSB0 115200 >> foo.txt
$: screen /dev/ttyUSB0 115200 | tee foo.txt

また、バッファファイルを画面から使用しようとしましたが、使用方法がわかりません。

簡単な方法はありますか?


私が使用しているプロダクション設定には、画面の複数のインスタンスがあります。私が必要とする出力の行は 'pts / 10'です。したがって、ファイルへの出力を取得するにはどうすればよいですか?
2016

回答:


129

ロギング用のコマンドラインオプションがあります。出力はscreenlog.nファイルに保存されます。nは画面の番号です。画面のmanページから:

'-L'画面にウィンドウの自動出力ロギングをオンにするように指示します。


6
ありがとう。画面の出力バッファーにすでにある画面を出力する方法はありますか?たとえば、ロギングを有効にするのを忘れましたが、出力はスクロール画面のバッファで利用できます-それをファイルに書き込む方法は?
Tagar

48
-ただ、ここに私のrepviousコメントのための答えだ...もう少しググstackoverflow.com/questions/4807474/...コマンドモードに取得するには、その後、ハードコピー-h <ファイル名>の場合の誰かでelseeはこれを必要とします:Ctrlキー+ Aと。
Tagar

3
ログファイルは、画面を実行したのと同じディレクトリに作成されます。
lepe 2016

1
昨日、「screen -L」を実行し、SSHセッションを切断し、今日再びログインし、「screen -r」を使用して再接続し(1つしかfind / -name "screen*log"ありませんでした)、終了しましたが、何も見つかりませんでした。
pacoverflow


104

Control-a + Hを使用して、ログをscreenlog.nファイルに保存することもできます。もう1つControl-a + Hでオフにします。

Ca H:現在のウィンドウの「screenlog.n」ファイルへのロギングを開始/終了します。


5
+1。ログを作成できない場合は、画面ウィンドウの作業ディレクトリを変更してみてくださいa:chdir /home/foobar/baz
。Ctrl

2
Ca + Hは画面ウィンドウを切り替えます。ログファイルとは関係ありません。
aaa90210 2017年

2
@ aaa90210ハードコピーの場合は、ctrl-aの後にhを別に押し​​ます。ctrl-aに続けてshift-hを押すと、完全なログファイルが開始されます。
James

1
Ctrl-a Hで作成されたscreenlog.0ファイルを探していますか?unix.stackexchange.com/questions/198881/…– straville
1

20

選択した回答は、複数のセッションではうまく機能せず、カスタムログファイル名を指定できません。

複数のスクリーンセッションの場合、これは私の公式です。

  1. プロセスごとに構成ファイルを作成します。

    logfile test.log
    logfile flush 1
    log on
    logtstamp after 1
    logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
    logtstamp on
    

    「オンザフライ」で実行したい場合は、logfile自動的に変更できます。 \012使用したとして、「改行」を意味\n:ログ・ファイルに印刷されますソースを

  2. 「-c」および「-L」フラグを使用してコマンドを開始します。

    screen -c ./test.conf -dmSL 'Test' ./test.pl
    

    それでおしまい。最初のフラッシュ後に「test.log」が表示されます。

    ...
    6 Something is happening...
    [ test.pl: 2016-06-01 13:02:53 ]
    7 Something else...
    [ test.pl: 2016-06-01 13:02:54 ]
    8 Nothing here
    [ test.pl: 2016-06-01 13:02:55 ]
    9 Something is happening...
    [ test.pl: 2016-06-01 13:02:56 ]
    10 Something else...
    [ test.pl: 2016-06-01 13:02:57 ]
    11 Nothing here
    [ test.pl: 2016-06-01 13:02:58 ]
    ...
    

「ログオン」が構成ファイルにある場合でも、「-L」が引き続き必要であることがわかりました。

画面で使用される時間フォーマット変数(%mなど)のリストが見つかりませんでした。これらのフォーマットのリンクがある場合は、以下に投稿してください。

追加

「オンザフライ」で実行したい場合は、次のスクリプトを使用できます。

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

これを使用するには、それを保存し(screen.sh)、+ x権限を設定します。

./screen.sh TEST ./test.pl

...そして./test.plを実行し、/ var / log / TEST.logにログファイルを作成します


1
ありがとう- on-the-fly一部は非常に便利です。
Ram RS

1
アップの後、作成した設定ファイルで一晩実行し、その場で削除された画面は、上でエラーが発生したscreen -r"Unable to open "/tmp/log.conf"。また、画面が[detached]状態から存在しなくなりました。何が問題だったのでしょうか?
Ram RS

1
コマンドは何をしますか?画面が見つからない場合はログファイルが再作成されるので、/ tmp /の領域が不足しているか、OSに関連する他の問題が発生していると思いますか?私は無期限に実行されるいくつかのサーバーでこのアプローチを使用しており、これまでのところ、少なくとも1年間はそのような状況は見られませんでした。必要に応じてチャットを開始できます。問題のデバッグをお手伝いします。
lepe

1
私はあなたが正しいと思います、そのようにプロセスを実行している場合、それは画面を終了すべきではありませんscreen bash。それは実行と同じです:。他のプロセスが画面を強制終了している場合は、「デッド」として表示されますが、消えることはありません。どうなるかわかりません。
lepe 2016年

1
@qräbnö:いいキャッチ!今までずっと気づかなかった。私はそれに応じて答えを更新しました。
-lepe

20

次のコマンドはScreenバージョン4.06.02で機能します。

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Screenmanページから:

-Logfile file : By default logfile name is "screenlog.0".
                You can set new logfile name with the "-Logfile" option.

screen -versionを使用して、Screenの既存のバージョンを確認できますhttps://www.gnu.org/software/screen/から最新のScreenバージョンをダウンロードしてインストールできます


また、command_to_be_executedを空白のままにして、一連の長時間実行ジョブを入力することもできます
devssh

画面の作業ディレクトリへの書き込み権限があることを忘れないでください。それ以外の場合は警告なしに失敗します(警告なしにログを記録しないだけです)
okrutny

15

Mac端末の場合:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200

細部

  • script:「ターミナルセッションのtypescriptを作成する」ための組み込みアプリケーション
  • -a:出力ファイルに追加
  • -t 0:出力ファイルへの書き込み間隔は0秒なので、out.txtは新しい文字ごとに更新されます
  • out.txt:単なる出力ファイル名です
  • screen /dev/ttyUSB0 115200:外部デバイスに接続するための質問からのコマンド

次に、tailを使用して、ファイルが更新されていることを確認できます。

tail -100 out.txt

1
これはMacでは機能しませんでした。ログファイルには、共通を開始するスクリプトと終了するコマンドが表示されますが、画面コマンドから受信したデータは表示されません。
デビッド

10

Ctrl+AそれからShift+H私のために働きます。screenlog.0プログラムの実行中にファイルを表示できます。


1
Ctrl + A、次にH。
Shimon Doodkin

1
@ShimonDoodkin私はそれを試しました、何らかの理由でDebianでは動作しません。他の人にも役立つかもしれません。ありがとう!
jaggedsoft 2018年

5

Unixでの「スクリプト」コマンドは、トリックを行う必要があります。新しいコンソールの開始時にそれを実行するだけで良いはずです。


すごい!どこに印刷していますか?
Edoardoo 2013年

ファイルに書き込むだけです。コマンドは、ビット厄介ですが、私は、これは、そのビットを解決するかもしれないと思う:linux.byexamples.com/archives/279/...
ルーベン

5

トリックは次のとおりsh -cです。

screen sh -c './some-script 2>&1 | tee mylog.log'

どこで2>&1stderrをstdoutにリダイレクトしてtee、エラーメッセージをキャッチしてログに記録できるか


5

以下は有用かもしれません(テスト済み:Linux / Ubuntu 12.04(Precise Pangolin)):

cat /dev/ttyUSB0

上記を使用して、必要なすべてのリダイレクトを実行できます。たとえば、ファイルに保存しているときに出力をコンソールにダンプするには、次のようにします。

cat /dev/ttyUSB0 | tee console.log

これは完璧に機能しました。Arduinoデータキャプチャセッションからのシリアルモニター出力をログに記録しています。
Ian Pitts 2017年

3

すでにアクティブに実行されている画面からスクロールバックバッファー全体の出力を保存する必要がある場合の別の答え:

Ctrl-a [ g SPACE G $ >.

これにより、バッファ全体が/ tmp / screen-exchangeに保存されます


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