출력 아래의 배쉬 프롬프트-백그라운드 로그 테일


15

Linux에서 실행되는 제품 중 하나를 관리하기 위해 사용자 정의 된 쉘을 가지고있는 회사에서 일 했었고이 쉘의 주요 기능을 복제하려고합니다.

모든 작업은 백그라운드 프로세스에 의해 수행되었으며 로그의 출력은 연결된 모든 사용자에게 표시됩니다.

통나무는 배경에서 껍질까지 뻗어 있으며 프롬프트 줄은 항상 맨 아래에 완벽하게 유지됩니다.

예를 들어

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #

bash 로이 작업을 수행하는 방법은 사용자 .bashrc 파일에서 분리 된 꼬리를 시작하는 것이었지만 명령의 출력이 stdout으로 전송되면 bash 프롬프트 아래에 들어옵니다.

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3

그리고 사용자는 Enter 키를 누르거나 CtrlC깨끗한 프롬프트 행 을 눌러야합니다 .

프롬프트가 항상 출력의 맨 아래로 이동하는 방법에 대한 아이디어가 없으며 운이 없기 때문에 Google에서 무언가를 찾기 위해 잘못된 용어를 사용하고 있다고 생각합니다. bash와 함께?


1
즉시 또는 새로운 프롬프트가 표시 될 때 출력 업데이트를 원하십니까?
ahilsend

즉시 "tail -f"를 실행하는 것과 가능한 한 동일하지만 하단에 프롬프트가 표시됩니다.
iamacarpet

무엇이 일어나는 tail -f이되는 상당한 양의 출력을 가진 명령을 입력 할 때 백그라운드 프로세스가 적극적으로 출력을 보낼 때 특히, 출력과 프롬프트 및 명령 출력?
추후 공지가있을 때까지 일시 중지되었습니다.

그들의 경우, 실행되는 명령은 자체가 아닌 백그라운드 프로세스를 통해서만 출력을 발생 시켰으므로 문제가되지 않았습니다. 이 경우 원하는 효과를 제공하는 솔루션을 얻은 후에는 구현에서 구현에 따라 출력이 혼합되는 것이 얼마나 나쁜지보고 재생하는 경우라고 생각합니다.
iamacarpet

1
그런 다음 screen 또는 tmux 사용 제안을 강력하게 지원합니다. 출력은 화면 공간에 대해 섞이지 않거나 싸울 수 없으며 창의 크기를 조정하고 (분할을 이동) 독립적으로 스크롤 할 수 있습니다. 머리말 / 꼬리말 / 상태 줄이 "무거운"것에 반대하는 경우이를 구성 할 수 있습니다. 바퀴가 재발 명되지 않았습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


1

다음은 tmux 또는 screen 또는 다른 프로그램을 사용하지 않고 필요한 것을 수행합니다. 프롬프트를 맨 아래에 유지합니다. "/ var / log / cron"을 필요한 파일로 바꾸십시오 :

#!/bin/bash 
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do 
  tput sc
  printf "\e[1;${L1}r\e[${L1};${C}f" 
  echo; echo ${line}
  printf "\e[1;${L}r" && tput rc
done

이 키는 터미널의 ANSI 제어 문자입니다. 특히 새로운 스크롤 가능 영역을 설정하는 "\ e [x; y"문. 따라서 로그 파일의 각 줄을 읽을 때 창의 맨 아래 줄이 스크롤 가능 영역에서 제외되고 로그 파일의 줄이 삽입 된 다음 맨 아래가 다시 추가됩니다.


고마워 마이클, 그것은 아름답게 작동합니다 =]-많은 로그 라인이 스크롤되는 동안 가끔 타이핑하는 문제가 있습니다. 콘솔 라인의 모든 텍스트를 백 스페이스 할 수는 없습니다 (테스트하고있었습니다) 바쁜 아파치 로그),하지만 그것을 위해 사용하려는 경우 문제가되지 않아야합니다.
iamacarpet

@iamacarpet 굉장합니다. 다행입니다.
Michael Martinez

11

대답은 화면 또는 tmux가 사용되었습니다

화면을 사용하여 구성하는 방법을 설명하겠습니다.

1) apt-get install screenUbuntu / Debian 또는 yum install screenRedHat 파생물을 사용하여 화면을 설치하십시오 .

2) screen -S shell_and_logs

3) 다음 프레스 Ctrl+ a이어 S(자본 S).
가로 화면이 나타납니다

4)를 눌러 Ctrl+는 a다음에 TAB
두 번째 분할 창으로 이동합니다이.

5) 여기에 다른 창을 만들려면 Ctrl+를 a눌렀다가 키를 눌렀을 때 명령 프롬프트가 표시됩니다.c

6) 당신은 눌러 두 번째 진열창의 크기를 조정할 수 있습니다 Ctrl+ a다음 입력 :resizeLines:나타납니다. 표시하려는 줄 수를 입력하십시오.

7) 마지막으로 Ctrl+ a와 +를 차례로 사용하여 창 사이를 전환 할 수 있습니다 TAB

아래 예를 참조하십시오


감사합니다 val0x00ff-아이디어가 마음에 들었습니다. 작업이 완료되었지만 문제의 시스템이 제공 한 경험만큼 깨끗하지는 않습니다. 경험이 부족한 사용자에게는 투명하지 않습니다. 메인 쉘이 계속 업데이트되는 것처럼 느끼기보다는 분명히 다른 쉘입니다.
iamacarpet

@iamacarpet tail -F /var/log/messages &로그인 실패가 발견되거나 일부 서비스에 문제가있을 때와 같이 무언가가 변경 될 때 메시지를 표시하는 또 다른 방법입니다. 그러나 이것은 대화식 쉘을 망칠 것이기 때문에 이상적이지 않습니다.
Valentin Bajrami

그렇습니다. 대화식 셸을 망치지 않고 바로 할 수있는 방법입니다. 기업 셸에서 수행 한 작업이므로 셸을 처음부터 작성할 필요는 없습니다. 그것을 달성하기 위해.
iamacarpet

1
@iamacarpet이 외에 다른 도구의 무리입니다 screentmux이이 작업을 수행 할 수 있습니다 - 예를 들어 BSD의 일부는 함께 제공 window명령. 선택의 여지가 있지만 사용자 정의 셸 또는 유연성으로 인해 사용 가능한 다른 옵션보다이 솔루션을 권장합니다. 최종 사용자에게는 투명하지 않을 수도 있지만 실제로는 그 차이를 알 수 없으며 고급 사용자 / sysadmin은에서 제공하는 추가 유연성을 사용할 수 있습니다 screen.
voretaq7

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"스크립트에 넣고 원하는 때마다 실행하십시오. #bash @ irc.freenode.org에서 이것에 대한 geirha 덕분에
발렌틴 Bajrami
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.