ssh가 원격 터미널("agetty")에 로그인할 때 무작위로 발생하며 관련 없는 문자를 ssh 세션 터미널에 즉시 출력합니다.
주기적으로 반복되면 "hh��cahh�" 또는 "hh��!ca[" 및 "CR" "LF"가 됩니다.
또한 특정 문자($"로 인식됨)는 해당 문자 뒤(및 포함)에 터미널에 출력되지 않기 때문에 복사하여 붙여넣을 수 없습니다.
이 데비안 배포판의 문제점이 인식된 이후 시스템 구성 파일에 변경 사항이 적용되지 않았습니다. 일부 불규칙한 출력 문제는 다음 방법으로 해결될 수 있습니다. (미세한 내구성을 위해)
stty sane
이 인코딩(?) 문제의 원인을 어떻게 디버깅할 수 있으며 프로세스 설명이나 pid(strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/'
ps | grep $pid
-> 이 출력이 stdout으로 종료되도록 하는 별도의 프로세스/프로그램이 있습니까?
답변1
호스트와 클라이언트 간의 시간 기반을 동기화하고 시간 경과에 따른 출력을 관찰함으로써 정의된 기간 동안 반복되는 tty 출력 패턴은 cron 서비스를 가리킬 가능성이 높습니다.
그런 다음 해당 바이너리의 출력(stdout, stderr)을 다음으로 리디렉션합니다./dev/비어 있음대조적으로, 로컬 로그 파일에서는 tty와의 인코딩 간섭이 사라집니다( service cron reload
, 사용 service cron restart
).
터미널 세션에 대한 인코딩을 사용할 수 없게 된 이유(입력 상호 작용 사용)에 대한 설명은 아직 없지만 다음 변경 사항으로 인코딩 문제가 해결되었습니다.
cron 구성 파일(tty 내의 인코딩 문제):
*29 * * * * /path_to_executable/binary > /shared_memory_tmpfs/log.file
- printf("표준 출력에 출력 기록");
- 이 바이너리의 여러 인스턴스인 경우 log.file을 삭제합니다.
cron 구성 파일(문제 해결됨):
*29 * * * * /path_to_executable/binary > /dev/null 2>&1
- fprintf("log.file에 출력 기록");
- 이 곱해진 바이너리 인스턴스가 콘텐츠를 로그하기 전에 log.file을 삭제하고 다시 엽니다.
이 tty 출력의 소스를 식별하는 데 어려움이 있습니다. 왜냐하면 리디렉션된 출력은 다시 시작된 모든 프로세스의 모든 재귀에서 지워지고 시작 시 짧은 기간만으로 몇 개의 문자가 다른 모든 후속 tty 출력을 엉망으로 만들 수 있기 때문입니다(특히 다음 형식은 라인 앞으로 및 커서) 가시성, 로그인 이벤트와 무관).
원인이 확인되면 문제를 해결하는 것은 어렵지 않습니다. 그럼에도 불구하고, 그 이유에 대한 설명은 흥미로울 것입니다.