tail
여러 원격 컴퓨터에 로그인하고 출력을 로컬 워크스테이션으로 전달하려고 합니다 . Ctrl-를 누르면 연결이 닫히기를 원합니다 C.
현재 나는 다음과 같은 기능을 가지고 있습니다거의예상대로 작동합니다.
function dogfight_tail() {
logfile=/var/log/server.log
pids=""
for box in 02 03; do
ssh server-$box tail -f $logfile | grep $1 &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
trap wait
}
연결이 닫히고 에서 출력을 받습니다 tail
. 다만 출력이 일괄적으로 이루어지기 때문에 약간의 버퍼링이 발생합니다.
여기 재미있는 부분이 있습니다 ...
/var/log/server.log
다음 명령을 실행하고 원격 컴퓨터의 파일에 "test"를 4~5회 추가하면 동일한 버퍼링 동작을 볼 수 있습니다.
ssh server-01 "tail -f /var/log/server.log | grep test"
...그리고 그것을 비활성화하는 두 가지 방법을 찾았습니다...
SSH에 -t 플래그를 추가합니다.
ssh -t server-01 "tail -f /var/log/server.log | grep test"
원격 명령에서 따옴표를 제거합니다.
ssh server-01 tail -f /var/log/server.log | grep test
그러나 이러한 방법 중 어느 것도 여러 시스템에서 수행되는 위 기능에 적합하지 않습니다.
dsh를 시도했는데 실행 시 동일한 버퍼링 동작이 발생했습니다.
dsh -m server-01,server-02 -c "tail -f /var/log/server.log | grep test"
마찬가지로 따옴표를 제거하면 버퍼링이 사라지고 모든 것이 잘 작동합니다.
dsh -m server-01,server-02 -c tail -f /var/log/server.log | grep test
또한 parallel-ssh
동일한 작업 방식을 시도했습니다 dsh
. 무슨 일인지 설명해 줄 수 있는 사람이 있나요?
이 문제를 어떻게 해결할 수 있나요? 가능하다면 직선 트랙을 이용하는 것이 이상적입니다 ssh
.
multitail
PS 임의의 명령을 실행할 수 있기를 원하기 때문에 또는 이와 유사한 것을 사용하고 싶지 않습니다 .
답변1
grep
여러분이 보고 있는 것은 Glibc에서 제공하는 표준 stdout 버퍼의 효과입니다. 가장 좋은 해결책은 --line-buffered
(GNU grep, 다른 구현이 이를 지원하는지 잘 모르겠습니다)를 사용하여 비활성화하는 것입니다.
에 관해서는왜이는 특정 상황에서만 발생합니다.
ssh server "tail -f /var/log/server.log | grep test"
서버에서 전체 명령을 따옴표로 묶어 실행하여 grep
버퍼가 채워질 때까지 기다립니다.
ssh server tail -f /var/log/server.log | grep test
로컬 컴퓨터에서 SSH 채널을 통해 전송된 출력을 실행합니다 grep
.tail
여기서 중요한 부분은 터미널인지 아닌지 grep
에 따라 stdin
동작을 조정하는 것 입니다. 을 실행하면 ssh -t
원격 명령이 제어 터미널을 사용하여 실행되므로 원격 명령은 grep
로컬 명령처럼 작동합니다.
답변2
이것을 살펴보십시오:multitail
MultiTail을 사용하면 터미널의 여러 창에서 로그 파일과 명령 출력을 모니터링, 색상화, 필터링 및 병합할 수 있습니다.
여러 서버에서 로그를 추적하려면 다음을 사용하세요.
multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'
답변3
사이드 로그에서 보실 수 있습니다.
SSH를 사용하여 로컬 및 원격 로그 파일을 읽을 수 있는 Java 도구를 만들었습니다. 사용하는 것은 매우 간단합니다.
추가 설명:https://github.com/pschweitz/insidelog/wiki
운영 체제에 해당하는 버전, Java 런타임에서 실행 가능한 기본 jar 버전을 다운로드하세요(Java 8_40 이상 필요).
https://github.com/pschweitz/insidelog/releases
전체 문서를 찾을 수 있습니다(Github 페이지에도 포함되어 있음).