ssh를 통해 여러 시스템의 테일 로그 파일 tail. 그러나 출력이 일괄 처리되기

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"

… 해제하는 두 가지 방법을 찾았습니다…

  1. ssh에 -t 플래그를 추가하십시오.

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
  2. 원격 명령에서 인용을 제거하십시오.

    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임의의 명령을 실행할 수 있기를 원하기 때문에 사용 하거나 유사한 것을 원하지 않습니다 .



답변

grepGlibc 에서 제공 하는 표준 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은 로컬 명령 처럼 작동합니다.


답변

이것 좀 봐: multitail

MultiTail을 사용하면 터미널의 여러 창에서 로그 파일과 명령 출력을 모니터링하고 색상을 지정하고 필터링하고 병합 할 수 있습니다.

여러 서버에서 로그를 테일링하려면 다음을 사용하십시오.

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'

답변

당신은 로그에서 체크 아웃 할 수 있습니다.

SSH를 사용하여 로컬 및 원격 로그 파일을 읽을 수있는 Java 도구입니다. 사용이 매우 간단합니다.

몇 가지 추가 설명 : https://github.com/pschweitz/insidelog/wiki

Java 런타임 내에서 기본 jar 릴리스 실행 파일의 운영 체제에 해당하는 버전을 다운로드하십시오 (java 8_40 이상 필요).

https://github.com/pschweitz/insidelog/releases

전체 문서를 찾을 수 있습니다 (Github 페이지에 포함되어 있음)