부팅 중인 일부 클라우드 시스템의 경우 특정 파일, 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))
기본 프로세스 교체 중 첫 번째는 tee
STDOUT/STDERR을 터미널과 중첩된 프로세스 교체로 전송하여 tee
내부적으로 파일에 내용을 저장하고 파이프도 출력을 STDIN /tmp/box-setup.log
으로 보내는 데 사용됩니다 .logger
답변2
Bash 스크립트가 실행되는 동안 콘솔이 비어 있기 때문에 저는 완전히 눈이 멀었습니다.
다른 방법으로 문제를 해결하고 싶을 수도 있습니다. 백그라운드에서 bash 스크립트를 실행한 다음 실행 less /tmp/box-setup.log
하고 F 키를 눌러 보고 있는 파일에 줄이 추가될 때(예: tail -f
) 화면을 계속 업데이트합니다.
백그라운드에서 스크립트를 실행하는 데 문제가 있는 경우 하나의 SSH 연결에 여러 세션을 사용 tmux
하거나 다중화하세요. 다른 쉘에서도 동일한 명령을 사용하십시오.screen
less
원래 질문:
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)
표준 출력과 표준 오류가 병합됩니다. 순서를 유지하려면 분리할 수 없습니다. 이는 일반적으로 바람직합니다. 어쨌든, 모두 같은 장소(예: 터미널)로 가는 것은 중요하지 않습니다.