Zapisz wyjście ekranu (programu) do pliku

130

Muszę zapisać całe wyjście Screen do pliku, aby później sprawdzić całą zawartość.

Powodem jest to, że zrzucam pamięć flash przez port szeregowy, używając Screen do połączenia z nią. Chciałbym zapisać go do pliku, aby sprawdzić strukturę pamięci.

Próbowałem:

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

Próbowałem też użyć pliku bufora z ekranu, ale nie rozumiem, jak go używać.

Czy jest łatwy sposób?

Edoardoo
źródło
Ustawienie produkcyjne, którego używam, ma wiele wystąpień ekranu. Ten, którego dane wyjściowe potrzebuję, ma wiersz „pkt / 10”. Co zatem powinienem zrobić, aby uzyskać wynik do pliku?
Sid,

Odpowiedzi:

129

Istnieje opcja wiersza poleceń do logowania. Dane wyjściowe są zapisywane w pliku screenlog.n, gdzie n to numer ekranu. Ze stron podręcznika ekranowego:

-L Powiedz ekranowi, aby włączyć automatyczne rejestrowanie danych wyjściowych dla systemu Windows.

Fergie
źródło
6
Dzięki. Czy istnieje sposób na wyświetlenie tego, co ekran już ma w swoim buforze wyjściowym? Np. Zapomniałem włączyć logowanie, ale wyjście jest dostępne w buforze ekranu przewijania - jak to zapisać do pliku?
Tagar
48
Po prostu wyszukałem w Google trochę więcej .. Oto odpowiedź na mój poprzedni komentarz - stackoverflow.com/questions/4807474/ ... Ctrl + A i: aby przejść do trybu poleceń, skopiuj na stałe -h <nazwa pliku> na wypadek, gdyby ktoś inny potrzebował tego.
Tagar
3
Plik dziennika zostanie utworzony w tym samym katalogu, w którym wykonałeś screen.
lepe
1
Wczoraj wykonałem "screen -L", rozłączyłem sesję SSH, zalogowałem się ponownie dzisiaj i ponownie podłączyłem za pomocą "screen -r" (miałem tylko jeden), wyszedłem i zrobiłem a, find / -name "screen*log"który nic nie znalazł.
pacoverflow
104

Możesz także użyć Control-a + H, aby zapisać dane logowania do pliku screenlog.n. Jeszcze jedno Control-a + H, aby wyłączyć.

Ca H: Rozpoczyna / kończy rejestrowanie bieżącego okna do pliku „screenlog.n”.

NeliJ
źródło
5
+1. Jeśli nie można utworzyć dziennika, spróbuj zmienić katalog roboczy okna ekranu: Ctrl- a+ :i wpisz na przykładchdir /home/foobar/baz
Chriki
2
Ca + H po prostu przełącza okna ekranu za mnie. Nie ma to nic wspólnego z plikiem dziennika!
aaa90210
2
@ aaa90210 To ctrl-a, po którym następuje oddzielne naciśnięcie h, aby wydrukować. ctrl-a, po którym następuje oddzielne naciśnięcie shift-h, uruchamia cały plik dziennika.
James
1
Szukasz pliku screenlog.0 utworzonego przez Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville
20

Wybrana odpowiedź nie działa dobrze w przypadku wielu sesji i nie pozwala na określenie niestandardowej nazwy pliku dziennika.

Oto moja formuła dla sesji z wieloma ekranami:

  1. Utwórz plik konfiguracyjny dla każdego procesu:

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

    Jeśli chcesz to zrobić „w locie”, możesz zmienić logfileautomatycznie. \012oznacza „nowy wiersz”, ponieważ użycie \nspowoduje wydrukowanie go w pliku dziennika: źródło .

  2. Uruchom polecenie z flagami „-c” i „-L”:

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

    Otóż ​​to. Po pierwszym rzucie zobaczysz „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 ]
    ...
    

Zauważyłem, że "-L" jest nadal wymagane, nawet jeśli w pliku konfiguracyjnym znajduje się "logowanie".

Nie mogłem znaleźć listy zmiennych formatu czasu (takich jak% m) używanych przez ekran. Jeśli masz link w tych formatach, prześlij go poniżej.

Dodatkowy

Jeśli chcesz to zrobić „w locie”, możesz użyć tego skryptu:

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

Aby z niego skorzystać, zapisz go (screen.sh) i ustaw + x uprawnienia:

./screen.sh TEST ./test.pl

... i wykona ./test.pl i utworzy plik dziennika w /var/log/TEST.log

lepe
źródło
1
Dziękuję - on-the-flyczęść jest super przydatna.
Ram RS
1
Następnie ekran działał przez noc z plikiem konfiguracyjnym utworzonym i usuniętym w locie, który został błędnie uruchomiony w pliku screen -rwith "Unable to open "/tmp/log.conf". Ponadto ekran przeszedł ze [detached]stanu do nieistnienia. Co mogło być problemem?
Ram RS
1
Co robi twoje polecenie? screen odtworzy plik dziennika, gdy go nie ma, więc zgaduję, że / tmp / zabrakło miejsca lub miał jakiś inny problem związany z systemem operacyjnym? Stosuję to podejście na kilku serwerach, które działają w nieskończoność i do tej pory nie widziałem takiej sytuacji od co najmniej 1 roku. Jeśli chcesz, możemy rozpocząć rozmowę i pomogę Ci rozwiązać problem.
lepe
1
Myślę, że masz rację, to nie powinno zakończyć ekran jeśli używasz proces ten sposób, który jest taki sam jak wykonanie: screen bash. Jeśli jakikolwiek inny proces zabija Twój ekran, powinien być wymieniony jako „martwy”, ale nie powinien znikać. Nie wiem, co to może być.
lepe
1
@ qräbnö: Niezły chwyt! Przez cały ten czas i nie zauważyłem tego. Odpowiednio zaktualizowałem odpowiedź.
lepe
20

Następujące polecenie działa dla wersji Screen 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Ze strony podręcznika Screen :

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

Możesz sprawdzić istniejącą wersję Screen za pomocą screen -version . Możesz pobrać i zainstalować najnowszą wersję Screen ze strony https://www.gnu.org/software/screen/ .

Nikhil
źródło
Możesz również pozostawić command_to_be_executed jako puste i wprowadzić serię długotrwałych zadań
devssh
Pamiętaj, aby mieć uprawnienia do zapisu w katalogu roboczym screen, ponieważ w przeciwnym razie po cichu zawiedzie (po prostu nie zaloguje się bez żadnego ostrzeżenia)
okrutny
15

W przypadku terminala Mac:

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

Detale

  • script: Wbudowana aplikacja do „tworzenia maszynopisu sesji terminala”
  • -a: Dołącz do pliku wyjściowego
  • -t 0: Czas między zapisem do pliku wyjściowego wynosi 0 sekund, więc plik out.txt jest aktualizowany po każdym nowym znaku
  • out.txt: To tylko nazwa pliku wyjściowego
  • screen /dev/ttyUSB0 115200: Polecenie z pytania dotyczące połączenia z urządzeniem zewnętrznym

Następnie możesz użyć tail, aby zobaczyć, że plik jest aktualizowany.

tail -100 out.txt
ryan
źródło
1
To nie działa dla mnie na komputerze Mac. Plik dziennika pokazuje skrypt rozpoczynający wspólny i kończący polecenie, ale nie zawiera danych otrzymanych z polecenia screen.
David,
10

Ctrl+Ato Shift+Hdziała dla mnie. Możesz przeglądać plik, screenlog.0gdy program jest nadal uruchomiony.

jaggedsoft
źródło
1
Ctrl + A, a następnie H.
Shimon Doodkin,
1
@ShimonDoodkin Próbowałem tego, z jakiegoś powodu nie działa na Debianie. Może być jednak pomocne dla innych. Dzięki!
jaggedsoft
5

Polecenie „script” w systemie Unix powinno załatwić sprawę. Po prostu uruchom go na początku nowej konsoli i powinno być dobrze.

Ruben
źródło
świetny! gdzie to drukuje?
Edoardoo,
Powinien po prostu zapisywać do pliku. Polecenie jest trochę niechlujne, ale myślę, że to może trochę rozwiązać: linux.byexamples.com/archives/279/ ...
Ruben
5

Oto sztuczka: zawiń to sh -c!

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

Gdzie 2>&1przekierowuje stderr na stdout, dzięki czemu teemożna przechwytywać i rejestrować komunikaty o błędach.

rkok
źródło
5

Poniższe mogą być przydatne (testowane na: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Korzystając z powyższego, możesz następnie wykonać wszystkie potrzebne zmiany wskazówek. Na przykład, aby zrzucić dane wyjściowe do konsoli podczas zapisywania do pliku, wykonaj następujące czynności:

cat /dev/ttyUSB0 | tee console.log
Keo Malope
źródło
Ten działał dla mnie idealnie. Loguję wyjście monitora szeregowego z sesji przechwytywania danych Arduino.
Ian Pitts
3

Inna odpowiedź, jeśli chcesz zapisać wynik całego bufora przewijania z już aktywnie działającego ekranu:

Ctrl-a [ g SPACE G $ >.

Spowoduje to zapisanie całego bufora do / tmp / screen-exchange

rkelleycook
źródło
2

Istniejący dziennik ekranu można zapisać przez:

Ctrl+A : hardcopy -h nazwa_pliku

Ratan Raj
źródło