Simpan Layar (program) output ke file

130

Saya perlu menyimpan seluruh output Layar ke file untuk memeriksa nanti semua konten.

Alasannya adalah bahwa saya membuang memori flash melalui port serial, menggunakan Layar untuk berinteraksi dengannya. Saya ingin menyimpannya di file untuk memeriksa struktur memori.

Saya sudah mencoba:

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

Dan saya juga mencoba menggunakan bufferfile dari layar, tetapi saya tidak mengerti bagaimana cara menggunakannya.

Apakah ada cara mudah?

Edoardoo
sumber
Pengaturan produksi yang saya gunakan memiliki beberapa contoh layar. Yang output yang saya butuhkan memiliki baris sebagai 'Poin / 10'. Maka apa yang harus saya lakukan untuk mendapatkan hasilnya ke file?
Sid

Jawaban:

129

Ada opsi baris perintah untuk masuk. Output disimpan ke file screenlog.n, di mana n adalah sejumlah layar. Dari halaman manual layar:

'-L' Layar Tell untuk mengaktifkan log keluaran otomatis untuk windows.

Fergie
sumber
6
Terima kasih. Apakah ada cara untuk menampilkan layar apa yang sudah ada di buffer keluarannya? Misalnya saya lupa mengaktifkan logging, tetapi output tersedia di buffer layar gulir - bagaimana cara menulis itu ke file?
Tagar
48
Cukup googled sedikit lagi .. Inilah jawaban untuk komentar berulang saya - stackoverflow.com/questions/4807474/... Ctrl + A dan: untuk mendapatkan ke mode perintah, kemudian hardcopy -h <nama file> dalam kasus ada orang lain yang membutuhkan ini.
Tagar
3
File log akan dibuat di direktori yang sama di mana Anda mengeksekusi layar.
lepe
1
Kemarin saya melakukan "layar -L", memutus sesi SSH saya, masuk lagi hari ini dan menyambungkan kembali menggunakan "layar -r" (saya hanya punya satu), keluar, dan melakukan find / -name "screen*log"yang tidak menemukan apa pun.
Pacoverflow
104

Anda juga dapat menggunakan Control-a + H untuk menyimpan penebangan ke file screenlog.n. Satu lagi Control-a + H untuk mematikan.

Ca H: Memulai / mengakhiri logging dari jendela saat ini ke file "screenlog.n".

NeliJ
sumber
5
+1. Jika log tidak dapat dibuat, maka cobalah mengubah direktori kerja jendela layar: Ctrl- a+ :dan ketik misalnyachdir /home/foobar/baz
Chriki
2
Ca + H hanya mengganti jendela layar untuk saya. Tidak ada hubungannya dengan file log!
aaa90210
2
@ aaa90210 Ini ctrl-a diikuti oleh pers h terpisah untuk hardcopy. ctrl-a diikuti oleh pers shift-h yang terpisah memulai file log lengkap.
James
1
Mencari file screenlog.0 yang dibuat oleh Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville
20

Jawaban yang dipilih tidak bekerja dengan baik dengan beberapa sesi dan tidak memungkinkan untuk menentukan nama file log kustom.

Untuk beberapa sesi layar, ini adalah rumus saya:

  1. Buat file konfigurasi untuk setiap proses:

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

    Jika Anda ingin melakukannya "on the fly", Anda dapat mengubahnya logfilesecara otomatis. \012berarti "baris baru", karena menggunakan \nakan mencetaknya di file log: sumber .

  2. Mulai perintah Anda dengan bendera "-c" dan "-L":

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

    Itu dia. Anda akan melihat "test.log" setelah flush pertama:

    ...
    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 ]
    ...
    

Saya menemukan bahwa "-L" masih diperlukan bahkan ketika "masuk" ada di file konfigurasi.

Saya tidak dapat menemukan daftar variabel format waktu (seperti% m) yang digunakan oleh layar. Jika Anda memiliki tautan format itu, silakan kirim di bawah.

Tambahan

Jika Anda ingin melakukannya "on the fly", Anda dapat menggunakan skrip ini:

#!/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

Untuk menggunakannya, simpan (screen.sh) dan set + x izin:

./screen.sh TEST ./test.pl

... dan akan menjalankan ./test.pl dan membuat file log di /var/log/TEST.log

lepe
sumber
1
Terima kasih - on-the-flybagian ini sangat berguna.
Ram RS
1
Menindaklanjuti, semalam layar dijalankan dengan file konfigurasi dibuat dan dihapus dengan cepat errored keluar pada screen -rdengan "Unable to open "/tmp/log.conf". Juga, layar berubah dari [detached]keadaan tidak ada. Apa yang bisa menjadi masalah?
Ram RS
1
Apa yang dilakukan perintahmu? layar akan membuat ulang file log ketika hilang, jadi saya menebak / tmp / kehabisan ruang atau ada masalah terkait OS lainnya? Saya menggunakan pendekatan ini di beberapa server yang berjalan tanpa batas dan sejauh ini saya belum melihat situasi seperti itu dalam setidaknya 1 tahun. Jika mau, kami dapat memulai obrolan dan saya dapat membantu Anda men-debug masalah Anda.
lepe
1
Saya pikir Anda benar, itu tidak harus mengakhiri layar jika Anda menjalankan proses seperti itu, yang sama dengan mengeksekusi: screen bash. Jika ada proses lain yang membunuh layar Anda, itu harus terdaftar sebagai 'mati', tetapi tidak hilang. Saya tidak yakin apa itu.
lepe
1
@ qräbnö: Tangkapan bagus! Selama ini dan saya tidak menyadarinya. Saya memperbarui jawabannya.
lepe
20

Perintah berikut berfungsi untuk Layar versi 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Dari halaman manual Layar :

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

Anda dapat memeriksa versi layar yang ada menggunakan versi layar . Anda dapat mengunduh dan menginstal versi Layar terbaru dari https://www.gnu.org/software/screen/ .

Nikhil
sumber
Anda juga dapat membiarkan command_to_be_executed kosong dan memasukkan serangkaian pekerjaan yang sudah berjalan lama
devssh
Ingatlah untuk memiliki izin menulis ke direktori kerja layar, karena jika tidak maka gagal secara diam-diam (hanya tidak masuk tanpa peringatan)
okrutny
15

Untuk terminal Mac:

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

Detail

  • script: Aplikasi bawaan untuk "membuat naskah naskah sesi terminal"
  • -a: Tambahkan ke file output
  • -t 0: Waktu antara menulis ke file output adalah 0 detik, jadi out.txt diperbarui untuk setiap karakter baru
  • out.txt: Apakah hanya nama file output
  • screen /dev/ttyUSB0 115200: Perintah dari pertanyaan untuk menghubungkan ke perangkat eksternal

Anda kemudian dapat menggunakan ekor untuk melihat bahwa file sedang diperbarui.

tail -100 out.txt
ryan
sumber
1
Ini tidak berfungsi untuk saya di Mac. File log menunjukkan skrip yang memulai perintah umum dan yang berakhir, tetapi bukan data yang diterima dari perintah layar.
David
10

Ctrl+Akemudian Shift+Hbekerja untuk saya. Anda dapat melihat file screenlog.0saat program masih berjalan.

jaggedsoft
sumber
1
Ctrl + A lalu H.
Shimon Doodkin
1
@ShimonDoodkin Saya mencobanya, untuk beberapa alasan tidak berfungsi pada Debian. Mungkin bisa membantu orang lain. Terima kasih!
jaggedsoft
5

Perintah 'script' di bawah Unix harus melakukan trik. Jalankan saja di awal konsol baru Anda dan Anda akan menjadi baik.

Ruben
sumber
Bagus! dimana itu mencetaknya?
Edoardoo
Seharusnya hanya menulis ke file. Perintah agak berantakan tapi saya pikir ini mungkin menyelesaikan sedikit: linux.byexamples.com/archives/279/…
Ruben
5

Ini triknya: bungkus sh -c!

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

Di mana 2>&1pengalihan stderr ke stdout sehingga teedapat menangkap dan mencatat pesan kesalahan.

rkok
sumber
5

Berikut ini mungkin berguna (diuji pada: Linux / Ubuntu 12,04 (Precise Pangolin)):

cat /dev/ttyUSB0

Dengan menggunakan di atas, Anda kemudian dapat melakukan semua arahan ulang yang Anda butuhkan. Misalnya, untuk membuang output ke konsol Anda sambil menyimpan ke file Anda, Anda akan melakukan:

cat /dev/ttyUSB0 | tee console.log
Keo Malope
sumber
Yang ini bekerja untuk saya dengan sempurna. Saya mencatat keluaran monitor serial dari sesi pengambilan data Arduino.
Ian Pitts
3

Jawaban berbeda jika Anda perlu menyimpan output seluruh buffer scrollback Anda dari layar yang sudah aktif berjalan:

Ctrl-a [ g SPACE G $ >.

Ini akan menyimpan seluruh buffer Anda ke / tmp / screen-exchange

rkelleycook
sumber
2

Log layar yang ada dapat disimpan oleh:

Ctrl+A : hardcopy -h nama file

Ratan Raj
sumber