저는 쿠분투 20.04를 실행하고 있습니다.
watch 명령은 procps 패키지에서 제공됩니다.
dpkg -l procps
디스플레이 버전:
2:3.3.16-1ubuntu2
warch의 출력을 다음과 같은 파일로 리디렉션합니다.
watch -t "date" >/tmp/Wex1
감시 옵션 -d 및 -g가 지정되지 않은 경우에도 그리고 옵션 -c 지정 여부에 관계없이 감시는 파일 ESC 시퀀스(ANSI 색상 시퀀스일 수 있음)를 기록합니다.
터미널로 출력하지 않을 때 시계가 출력의 색상 순서를 억제한다는 내용을 인터넷 어딘가에서 읽었습니다. 하지만 내 경우에는 그렇지 않습니다.
시계에서 ESC 시퀀스가 출력되지 않도록 하는 방법을 아는 사람이 있나요?
- 2022년 4월 28일 부록:
고마워요. 하지만 모든 것이 더 복잡합니다.
(a) 커서 이동에 사용되는 ESC 시퀀스와 색상에 사용되는 ESC 시퀀스를 알 수 있습니다. 커서 이동에 사용되는 것을 유지하고 싶습니다.
(b) watch의 -c 옵션은 watch에 의해 실행된 명령이 watch에 색상을 전달하는지 여부와 관련됩니다. 그렇지 않다.
(c) "date" 지시문은 내 게시물의 간단한 예일 뿐입니다. 실제로 세 가지 명령 체인이 있습니다: 1. df(이전 상태와 비교하기 위한 diff 내), 2. free, 3. pmap. 다음과 같이:
warch -d "df -T -a >/tmp/WEx_df_a__2; diff -U0 /tmp/WEx_df_a__1 /tmp/WEx_df_a__2; echo \"\"; free -h -w; echo \"\"; pmap -X 2205860"
파이프를 덜 사용하거나 사용하지 않습니다.
(d) 나는 보통 시계의 좋은 출력을 눈으로 관찰한다. 특별한 경우에는 준 스크린샷을 만들고 싶습니다.
추가: Konsole에서 제공하는 Kubuntu 터미널은 /dev/tty2가 아닌 /dev/pts/21이므로 screendump 및 /dev/vcs를 사용할 수 없습니다.
따라서 문서화 및 구문 분석을 위해 Watch의 출력을 파일에 작성해야 합니다.
(e) 시계가 파일에 쓰는 내용을 처리하여 색상 순서를 제거했습니다.
나는 인터넷에 있는 몇 가지 정규식을 사용하여 Perl 프로그램을 작성했습니다.
https::/itectec.com/superuser/removing-ansi-color-codes-from-text-stream
(f) 내 Perl 스크립트는 계속 증가하지만 아직 완료되지 않았습니다. 많은 어려움으로 인해 진행할 방법을 찾을 수 없습니다.
(f1) Perl 스크립트의 출력을 터미널(Kubuntu, Konsole, 예: /dev/pts/21)에 직접 출력할 때 아무것도 표시되지 않습니다. 출력은 less로 파이프할 때만 표시되며 인쇄할 수 없는 문자는 less의 변환으로 표시됩니다.
(f2) 더 적게 사용해야 하기 때문에 pmap에서 생성된 레이아웃이 손실되고 모든 단어는 공백을 구분 기호로 사용하는 체인입니다.
나도 먹였어
xxd-g1
하지만 지금은 잊어버렸어요.
안톤 인사말
- 2022년 4월 30일 부록:
감사해요. 이제 새로운 이해를 통해 모든 것을 살펴보고 개발자가 아직 해야 할 일이 많다는 것을 알게 되었습니다.
(ㅏ)
내가 쓴 내용은 완전히 정확하지 않습니다. 커서 이동에 사용되는 ESC 시퀀스와 색상에 사용되는 ESC 시퀀스입니다.
커서 이동에 사용되지 않는 ESC 시퀀스는 강조 표시에 사용됩니다. 이것은 컬러를 통해서가 아니라 비디오를 반전시킴으로써 이루어집니다.
역방향 비디오 출력의 경우 ansi 색상 코드는 적합하지 않지만 다른 색상 코드는 적합합니다.
watch의 일회성 출력을 구문 분석하려면 이를 간단한 마크업으로 바꿔야 합니다.
고려해야 할 다른 결함이 있는 경우.
(둘)
실제 터미널 사용을 위해서는
정보 CMP -L -1
터미널이 어떤 제어 시퀀스를 받아들였는지 확인할 수 있습니다.
xxd-g1
명령 watch를 통해 어떤 시퀀스가 출력되는지 확인할 수 있습니다.
시계에서 출력되는 일부 시퀀스가 내 터미널의 infocmp 목록에 포함되어 있지 않습니다.
"watch" 명령은 xterm-256-color용으로 설계된 것 같지 않습니다.
(씨)
watch의 출력이 터미널에 직접 입력되지 않고 파일에 저장되고 파일 내용이 터미널에 입력될 때 두 가지 오류가 발생했습니다.
(C1)
터미널 설정이 손상되었습니다.
SHIFT-UPARROW를 입력하면 디스플레이가 한 줄(일반)로 이동하지 않고 대문자 "A"가 표시됩니다.
복구하려면 "reset"을 입력해야 했습니다.
시계의 어떤 출력 순서가 원인인지 찾았습니다.
/e[?1049h\e[22;0;0t
이것이 시계 출력의 시작입니다.
(C2)
두 번째 실패는 화면에 파일 내용이 전혀 표시되지 않는다는 것입니다. 더 적은 수 중 하나에 배관을 연결해야만 출력의 존재를 감지할 수 있습니다.
파일 내용이 특정 위치에서 삭제되면 이 오류를 피할 수 있습니다.
위치와 이유를 찾았습니다.
/e[?1049l\e[23;0;0t
안톤 인사말
- 부록 2022년 5월 1일
모든 내용을 맥락에서 볼 수 있도록 다음을 추가합니다. 이 이야기는 내 게시물 10.04.2022…/questions/698648/…
이 기사에서는 pmap 명령의 PID 2205860이 무엇인지 언급하는 것을 잊었습니다. 이것은 다른 터미널에서 실행되는 기본 프로그램의 PID입니다.
/media/.../wels_fullpath -d / 2>/dev/null | /media/.../wels_fullpath -d / 2>/dev/null | grep -v -e "^fd1" >/tmp/WEx_fullpath_of_slash_ie_mountpoint_of_cow_fs_overlay__unsorted
내 주요 프로그램은 누가 무엇을 했는지 분석하는 데 도움을 주기 위해 여러 날 동안 실행되었기 때문에 하룻밤 사이에 덮어쓴 파일 시스템에서 많은 GB가 도난당했습니다.
앞으로
df -Th -a가 표시됩니다.
/니우 오버레이 16G 1.3G 15G 8% /
내 원래 질문은 "적음"에 대한 버퍼가 어디에 있느냐는 것이었습니다. 저는 이를 우회했으며 더 이상 해당 문제를 해결하기 위해 "적음"을 사용하지 않습니다.
antondhdih에게 안부 인사
답변1
편집: 또한 일종의 제어 시퀀스 없이는 시계가 출력을 파일로 리디렉션하도록 할 수 없습니다. 바라보다"watch" 명령을 목록으로 출력해결책을 찾으세요.
설정으로 인해 발생하는 이상한 일을 배제하기 위해 다음 출력을 비교해 볼 수 있습니다.
# ESC sequences should be visible. less -R should not output colors ans the output is broken.
watch -t "/bin/ls / --color=always" >/tmp/watch_nocolor.log
# different ESC sequences expected. less -R should show colors but again, broken output.
watch -ct "/bin/ls / --color=always" >/tmp/watch_colorinterpret.log
ls
Kubuntu의 동작은 내 Lubuntu 인스턴스(문제를 재현할 수 있음)와 동일해야 합니다.
모니터링하고 있는 명령을 파이핑해 보세요 cat
. watch -t 'date | cat' > /tmp/Wex1
하지만 다르게 행동해서는 안 됩니다. 그러나 대부분의 프로그램은 터미널에 출력하지 않는다는 점을 알아야 하므로 전체 명령 사이에 배치하면 영향을 미칠 수 있습니다.
답변2
watch
화면에서 다양한 명령 실행 간의 차이점을 볼 수 있도록 설계되었습니다. 다음 실행의 출력을 찾기 위해가지다커서를 이동합니다(ANSI 이스케이프 시퀀스 사용).
제가 아는 한, 제거할 수 있는 방법은 없습니다. 기본적으로 이 프로그램은 여러분이 기대하는 대로 작동하도록 의도되지 않았습니다.
또 다른 옵션은 쉘 루프를 사용하는 것이므로 다음을 사용할 수 있습니다.
$ watch -t date >/tmp/Wex1
다음과 같이 특정 작업을 수행할 수 있습니다 bash
(기본값은 실행 간격 2초 watch
).
$ while date; do sleep 2; done >/tmp/Wex1
쉘의 루핑 구조를 확인하십시오. 프로그램에서 0이 아닌 종료 코드를 사용하면 위치에 따라 원하는 경우 루프가 중지될 수 있습니다.