파일에 화면 (프로그램) 출력 저장


130

나중에 모든 내용을 확인하려면 Screen 의 전체 출력을 파일 로 저장해야합니다 .

그 이유는 직렬 포트를 통해 플래시 메모리를 덤프하고 Screen을 사용하여 플래시 메모리를 덤프하기 때문입니다. 메모리 구조를 확인하기 위해 파일에 저장하고 싶습니다.

난 노력 했어:

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

또한 화면에서 버퍼 파일을 사용하려고 시도했지만 사용 방법을 이해하지 못합니다.

쉬운 방법이 있습니까?


사용중인 프로덕션 설정에 여러 화면 인스턴스가 있습니다. 출력이 필요한 사람은 'pts / 10'으로 줄이 있습니다. 따라서 파일로 출력을 얻으려면 어떻게해야합니까?
Sid

답변:


129

로깅을위한 명령 행 옵션이 있습니다. 출력은 screenlog.n 파일에 저장됩니다. 여기서 n은 화면의 수입니다. 화면 맨 페이지에서 :

'-L'화면에 창에 대한 자동 출력 로깅을 설정하도록 지시합니다.


6
감사. 출력 버퍼에 이미있는 화면을 출력하는 방법이 있습니까? 예를 들어 로깅을 활성화하는 것을 잊었지만 스크롤 화면 버퍼에서 출력을 사용할 수 있습니다. 파일에 파일을 쓰는 방법은 무엇입니까?
Tagar

48
- 그냥 여기 내 repvious 의견에 대한 답변입니다 .. 좀 더 봤 stackoverflow.com/questions/4807474/... 명령 모드에 도착 후 하드 카피 -h <파일 이름>의 경우 사람에 elsee이 필요합니다 : Ctrl + A합니다.
Tagar

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를 별도로 누르면 완전한 로그 파일이 시작됩니다.
James

1
Ctrl-a H로 작성된 screenlog.0 파일을 찾고 계십니까? 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"new line"을 의미합니다. 사용 \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
당신의 명령은 무엇입니까? 화면에 누락 된 로그 파일이 다시 생성되므로 / tmp / 공간이 부족하거나 다른 OS 관련 문제가 있다고 생각합니까? 나는 무한대로 실행되는 여러 서버 에서이 방법을 사용하며 지금까지 최소 1 년 동안 그러한 상황을 보지 못했습니다. 원하는 경우 채팅을 시작할 수 있으며 문제를 디버깅하는 데 도움을 줄 수 있습니다.
lepe

1
나는 당신이 옳다고 생각합니다. 프로세스를 그런 식으로 실행하면 화면을 종료해서는 안됩니다 screen bash. 다른 프로세스가 화면을 종료하는 경우 '죽음'으로 표시되어야하지만 사라지지 않아야합니다. 나는 그것이 무엇인지 잘 모르겠습니다.
lepe

1
@ qräbnö : 멋진 캐치! 이 모든 시간과 나는 그것을 눈치 채지 못했습니다. 이에 따라 답변을 업데이트했습니다.
lepe

20

다음 명령은 Screen 버전 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 -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: "터미널 세션의 타이프 스크립트 작성"을위한 내장 응용 프로그램
  • -a: 출력 파일에 추가
  • -t 0: 출력 파일에 쓰는 시간이 0 초이므로 out.txt는 모든 새 문자에 대해 업데이트됩니다.
  • out.txt: 출력 파일 이름 일뿐
  • screen /dev/ttyUSB0 115200: 외부 장치 연결을위한 질문 명령

그런 다음 tail 을 사용 하여 파일이 업데이트되고 있는지 확인할 수 있습니다 .

tail -100 out.txt

1
이것은 Mac에서 작동하지 않았습니다. 로그 파일은 공통 시작 스크립트와 종료 명령 스크립트를 표시하지만 화면 명령에서 수신 한 데이터는 표시하지 않습니다.
David

10

Ctrl+A그런 다음 Shift+H나를 위해 작동합니다. screenlog.0프로그램이 계속 실행되는 동안 파일 을 볼 수 있습니다 .


1
Ctrl + A와 H
Shimon Doodkin

1
@ ShimonDoodkin 나는 어떤 이유로 데비안에서 작동하지 않는 것을 시도했습니다. 그래도 다른 사람들에게 도움이 될 수 있습니다. 감사!
jaggedsoft

5

유닉스에서 '스크립트'명령은 트릭을 수행해야합니다. 새 콘솔이 시작될 때 실행하면됩니다.


큰! 어디에서 인쇄합니까?
Edoardoo

파일에 쓰면됩니다. 명령이 약간 지저분하지만 이것이 조금 해결 될 수 있다고 생각합니다. linux.byexamples.com/archives/279/…
Ruben

5

여기 속임수가 있습니다 sh -c.

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

어디 2>&1리디렉션 stdout에 stderr에 너무 tee잡기 및 오류 메시지를 기록 할 수 있습니다.


5

다음이 유용 할 수 있습니다 (Linux / Ubuntu 12.04 (Precise Pangolin) 에서 테스트 ).

cat /dev/ttyUSB0

위의 방법을 사용하면 필요한 모든 리디렉션을 수행 할 수 있습니다. 예를 들어 파일에 저장하는 동안 콘솔에 출력을 덤프하려면 다음을 수행하십시오.

cat /dev/ttyUSB0 | tee console.log

이것은 나를 위해 완벽하게 작동했습니다. Arduino 데이터 캡처 세션에서 직렬 모니터 출력을 로깅하고 있습니다.
Ian Pitts

3

이미 실행중인 화면에서 전체 스크롤 백 버퍼의 출력을 저장 해야하는 경우 다른 대답 :

Ctrl-a [ g SPACE G $ >.

이것은 전체 버퍼를 / tmp / screen-exchange에 저장합니다


2

기존 화면 로그는 다음을 통해 저장할 수 있습니다.

Ctrl+A : 하드 카피 -h 파일 이름

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.