Зберегти вихідний екран (програма) у файл


130

Мені потрібно зберегти весь вихідний екран у файл, щоб пізніше перевірити весь вміст.

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

Я спробував:

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

Я також намагався використовувати буферний файл із екрана, але не розумію, як ним користуватися.

Чи є простий спосіб?


Налаштування виробництва, який я використовую, має кілька примірників екрана. Той, чий вихід мені потрібен, має рядок "pts / 10". Отже, що мені робити, щоб отримати його вихід у файл?
Сід

Відповіді:


129

Існує варіант командного рядка для ведення журналу. Вихід зберігається у файлі screenlog.n, де n - це номер екрана. З головних сторінок екрану:

'-L' Повідомте екран, щоб увімкнути автоматичний журнал виводу для Windows.


6
Дякую. Чи є спосіб вивести, який екран вже є у своєму вихідному буфері? Наприклад, я забув увімкнути журнал, але вихід доступний у буфері екрана прокрутки - як записати це у файл?
Тагар

48
Просто гуглі трохи більше .. Ось відповідь на мій repvious коментар - stackoverflow.com/questions/4807474 / ... Ctrl + A і: щоб потрапити в командний режим, а потім роздруківку -h <ім'я файлу> в разі , якщо хто - то elsee потребуватиме в цьому.
Тагар

3
Файл журналу буде створено в тому самому каталозі, в якому ви виконували екран.
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частина дуже корисна.
Рам РС

1
Після цього екран запускається протягом ночі із створеним та видаленим конфігураційним файлом на льоту, помилково виходить на screen -rс "Unable to open "/tmp/log.conf". Також екран перейшов від [detached]стану до неіснуючого. У чому могла бути проблема?
Рам RS

1
Що робить ваша команда? на екрані буде відтворено файл журналу, коли його немає, тож я здогадуюсь / tmp / не вистачає місця або у вас виникли проблеми, пов’язані з ОС? Я використовую такий підхід на декількох серверах, які працюють нескінченно, і поки що я не бачив такої ситуації принаймні за рік. Якщо ви хочете, ми можемо розпочати чат, і я можу допомогти вам налагодити вашу проблему.
лепе

1
Я не думаю , що ти маєш рацію, він повинен не припиняти екран , якщо ви запускаєте процес, шлях, який так само , як виконання: screen bash. Якщо будь-який інший процес вбиває ваш екран, він повинен бути вказаний як "мертвий", але не зникати. Я не впевнений, що це може бути.
lepe

1
@ qräbnö: Приємний улов! Весь цей час, і я цього не помічав. Відповідно я оновив відповідь.
lepe

20

Для екрана версії 4.06.02 працює наступна команда:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

На головній сторінці екрана :

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

Ви можете перевірити існуючу версію екрана за допомогою екранізації екрана . Ви можете завантажити та встановити останню версію екрана з https://www.gnu.org/software/screen/ .


Також ви можете залишити команду_____виконати як порожню і ввести серію тривалих завдань
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 -100 out.txt

1
Це не спрацювало для мене на Mac. Файл журналу показує скрипт, що починає загальне і закінчується командою, але не дані, отримані від екранної команди.
Девід

10

Ctrl+Aто Shift+Hпрацює на мене. Ви можете переглянути файл, screenlog.0поки програма все ще працює.


1
Ctrl + A, то H.
Шимон Додкін

1
@ShimonDoodkin Я спробував це, чомусь не працює на Debian. Хоча це може бути корисним для інших. Дякую!
jaggedsoft

5

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


чудово! де це друкує?
Edoardoo

Він повинен просто записувати у файл. Команда трохи безладна, але я думаю, що це може трохи вирішити: 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 (Precision Pangolin)):

cat /dev/ttyUSB0

Використовуючи вищесказане, ви зможете виконати всі необхідні повторні вказівки. Наприклад, щоб скинути вихід на консоль, зберігаючи у файл, ви зробите:

cat /dev/ttyUSB0 | tee console.log

Цей відмінно працював на мене. Я реєструю послідовний вихід монітора з сеансу збору даних Arduino.
Ян Піттс

3

Інша відповідь, якщо вам потрібно зберегти вихід всього буфера прокрутки з уже активно працюючого екрана:

Ctrl-a [ g SPACE G $ >.

Це збереже весь ваш буфер до / tmp / обміну екраном


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.