Сохранить вывод экрана (программы) в файл


130

Мне нужно сохранить весь вывод Screen в файл, чтобы позже проверить все содержимое.

Причина в том, что я выгружаю флеш-память через последовательный порт, используя Screen для взаимодействия с ней. Я хочу сохранить его в файл, чтобы проверить структуру памяти.

Я пробовал:

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

И я также пробовал использовать буферный файл с экрана, но не понимаю, как его использовать.

Есть простой способ?


В производственной настройке, которую я использую, есть несколько экземпляров экрана. Тот, чей вывод мне нужен, имеет строку как «pts / 10». Следовательно, что мне делать, чтобы получить его вывод в файл?
Сид

Ответы:


130

Есть опция командной строки для регистрации. Вывод сохраняется в файл screenlog.n, где n - номер экрана. Из справочных страниц экрана:

'-L' Указывает экрану включить автоматическое ведение журнала вывода для окон.


6
Спасибо. Есть ли способ вывести, какой экран уже имеет в выходном буфере? Например, я забыл включить ведение журнала, но вывод доступен в буфере экрана прокрутки - как записать это в файл?
Tagar

48
Просто погуглил еще немного .. Вот ответ на мой повторный комментарий - stackoverflow.com/questions/4807474/… Ctrl + A и: чтобы перейти в командный режим, затем скопируйте -h <filename> на случай, если это понадобится кому-то другому.
Tagar

3
Файл журнала будет создан в том же каталоге, в котором вы запустили screen.
lepe

1
Вчера я сделал «screen -L», отключил сеанс SSH, сегодня снова зашел в систему и снова подключился с помощью «screen -r» (у меня был только один), вышел и сделал то, find / -name "screen*log"что ничего не нашел.
pacoverflow


104

Вы также можете использовать Control-a + H для сохранения журналов в файл screenlog.n. Еще один Control-a + H, чтобы выключить.

Ca H: Начало / завершение записи текущего окна в файл "screenlog.n".


5
+1. Если не удается создать журнал, попробуйте изменить рабочий каталог окна экрана: Ctrl- a+ :и введите, например,chdir /home/foobar/baz
Chriki

2
Ca + H просто переключает для меня окна экрана. Ничего общего с файлом журнала!
aaa90210

2
@ aaa90210 Это ctrl-a, за которым следует отдельное нажатие h для распечатки. ctrl-a с последующим отдельным нажатием shift-h запускает полный файл журнала.
Джеймс

1
Ищете файл screenlog.0, созданный с помощью Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville

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напечатает ее в файле журнала: source .

  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 -rwith "Unable to open "/tmp/log.conf". Кроме того, экран перешел из [detached]состояния в состояние "несуществующий". В чем могла быть проблема?
Ram RS

1
Что делает ваша команда? screen будет воссоздавать файл журнала, если он отсутствует, поэтому я предполагаю, что / tmp / не хватает места или возникла другая проблема, связанная с ОС? Я использую этот подход на нескольких серверах, которые работают бесконечно, и до сих пор я не видел такой ситуации как минимум год. Если вы хотите, мы можем начать чат, и я могу помочь вам решить вашу проблему.
lepe

1
Я не думаю , что вы правы, это должно не прекращать экран , если вы запускаете процесс, путь, который так же , как выполнение: screen bash. Если какой-либо другой процесс убивает ваш экран, он должен быть указан как «мертвый», но не исчезать. Я не уверен, что это может быть.
lepe

1
@ qräbnö: Хороший улов! Все это время я этого не замечал. Я обновил ответ соответственно.
Леп

20

Следующая команда работает с версией экрана 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

На странице руководства Screen :

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

Вы можете проверить существующую версию Screen, используя screen -version . Вы можете загрузить и установить последнюю версию экрана со страницы https://www.gnu.org/software/screen/ .


Также вы можете оставить command_to_be_executed пустым и ввести серию длительно выполняющихся заданий
devssh

Не забудьте иметь права на запись в рабочий каталог экрана, потому что в противном случае он выйдет из строя (просто не войдя в систему без предупреждения)
окрутный

15

Для терминала Mac:

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

подробности

  • script: Встроенное приложение для "создания машинописного текста сеанса терминала"
  • -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.
Шимон Дудкин

1
@ShimonDoodkin Я пробовал это, по какой-то причине не работает в Debian. Хотя может быть полезно другим. Спасибо!
jaggedsoft

5

Команда 'script' в Unix должна помочь. Просто запустите его в начале новой консоли, и все будет хорошо.


здорово! где это печатает?
Edoardoo 08

Он должен просто записывать в файл. Команда немного запутана, но я думаю, что это может немного решить эту проблему: linux.byexamples.com/archives/279/…
Рубен

5

Вот трюк: заверните его sh -c!

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

Где 2>&1перенаправляет stderr на stdout, чтобы teeможно было улавливать и регистрировать сообщения об ошибках.


5

Может быть полезно следующее (проверено на: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Используя вышеизложенное, вы можете выполнить все необходимые изменения направления. Например, чтобы вывести вывод на консоль при сохранении в файл, вы должны:

cat /dev/ttyUSB0 | tee console.log

Этот сработал для меня отлично. Я регистрирую вывод последовательного монитора из сеанса сбора данных Arduino.
Ян Питтс

3

Другой ответ, если вам нужно сохранить вывод всего вашего буфера прокрутки с уже активно работающего экрана:

Ctrl-a [ g SPACE G $ >.

Это сохранит весь ваш буфер в / tmp / screen-exchange


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.