stdout 및 stderr을 파일, syslog 및 터미널로 보내기

stdout 및 stderr을 파일, syslog 및 터미널로 보내기

부팅 중인 일부 클라우드 시스템의 경우 특정 파일, syslog 및 터미널/콘솔에 로그인하려고 합니다.

내 컴퓨터 설정/클라우드 초기화 스크립트 상단에 다음이 있습니다.

#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package

이는 출력을 파일 및 syslog로 보내는 데 효과적이지만 출력을 터미널로 파이프하지는 않습니다.

일반적으로 원격 콘솔에서 디버깅하지 않는 한 터미널 출력이 없는 것은 큰 문제가 되지 않습니다. 이런 일이 발생하면 bash 스크립트가 실행되는 동안 콘솔이 비어 있기 때문에 완전히 눈이 멀었습니다.

bash리디렉션이나 다른 수단을 사용하여 모든 출력(stdout 및 stderr)을 파일, syslog 및 터미널로 동시에 파이프하는 쉬운 방법이 있습니까 ?

우분투 16.04를 실행 중입니다.

답변1

tee다음과 같이 중첩된 프로세스 교체 하나와 다른 하나를 추가합니다 .

exec &> >(tee >(tee "/tmp/box-setup.log" | logger -t box-setup))

기본 프로세스 교체 중 첫 번째는 teeSTDOUT/STDERR을 터미널과 중첩된 프로세스 교체로 전송하여 tee내부적으로 파일에 내용을 저장하고 파이프도 출력을 STDIN /tmp/box-setup.log으로 보내는 데 사용됩니다 .logger

답변2

Bash 스크립트가 실행되는 동안 콘솔이 비어 있기 때문에 저는 완전히 눈이 멀었습니다.

다른 방법으로 문제를 해결하고 싶을 수도 있습니다. 백그라운드에서 bash 스크립트를 실행한 다음 실행 less /tmp/box-setup.log하고 F 키를 눌러 보고 있는 파일에 줄이 추가될 때(예: tail -f) 화면을 계속 업데이트합니다.

백그라운드에서 스크립트를 실행하는 데 문제가 있는 경우 하나의 SSH 연결에 여러 세션을 사용 tmux하거나 다중화하세요. 다른 쉘에서도 동일한 명령을 사용하십시오.screenless


원래 질문:

tee여러 대상에 복사할 수 있습니다. 특수 파일을 사용하여 그 중 하나를 터미널로 설정하십시오 /dev/tty. 나는 그것이 항상 현재 프로세스의 제어 tty를 참조한다고 생각합니다. 아니면 stderr이 여전히 쉘의 stderr에 연결되어 있기 /dev/stderr때문에 더 나을 수도 있습니다 . tee(이렇게 하면 &> /dev/null을 사용하여 스크립트를 침묵시킬 수 있습니다).

exec &> >(tee /dev/stderr "/tmp/box-setup.log" | logger -t box-setup)

그건 그렇고, 이것은 Danby 와 동일합니다 (tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...).

tee일부 파일 설명자 복제본은 표준 오류 대신 원본 스크립트의 표준 출력을 제공하는 데 사용될 수 있습니다 .

답변3

/dev/stderr(원하는 것을) 출력으로 에 추가하기 만 하면 됩니다 tee.

exec &> >(tee /dev/stderr "/tmp/box-setup.log" | logger -t box-setup)

표준 출력과 표준 오류가 병합됩니다. 순서를 유지하려면 분리할 수 없습니다. 이는 일반적으로 바람직합니다. 어쨌든, 모두 같은 장소(예: 터미널)로 가는 것은 중요하지 않습니다.

관련 정보