출력을 리디렉션할 때 openSUSE Leap 15.3에서 ps aux --headers 문제 발생

출력을 리디렉션할 때 openSUSE Leap 15.3에서 ps aux --headers 문제 발생

다음은 openSUSE Leap 15.3에서 제대로 실행됩니다. 터미널의 스크롤 막대를 사용하여 뒤로 스크롤하면 각 출력 화면에 대해 헤더 줄이 반복됩니다.

ps aux --headers

그러나 출력을 파일이나 다른 명령으로 리디렉션하면 출력의 첫 번째 줄에 있는 초기 헤더 줄만 표시됩니다. 각 출력 화면의 예상 헤더 행이 누락되었습니다. 실제 프로세스의 출력은 정상적으로 나타납니다. 문제를 재현하는 2가지 명령:

ps aux --headers | less

또는

ps aux --headers  >> ps.out

화면 및 파일 출력에 tee 명령을 사용할 때도 동일한 문제가 발생합니다.

ps aux --headers | tee ps-tee.out

오류가 발생하는지 확인하기 위해 다음 명령을 사용했지만 오류 파일이 비어 있었습니다.

ps aux --headers 1>>ps.out 2>>ps.error

grep이 헤더 행을 찾을 때 한 번만 일치합니다.

dave@localhost:~> ps aux --headers | egrep RSS | egrep -v grep
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dave@localhost:~> 

나는 bash를 사용하고 있지만 ksh, csh 및 zsh도 시도했지만 동일한 문제가 발생했습니다.

이 문제는 GUI 데스크탑(KDE/Konsole)에서 터미널을 시작할 때와 Putty를 사용하여 상자에 SSH로 접속할 때 모두 발생합니다.

openSUSE Leap 15.3 외에도 SUSE Linux Enterprise 15.3 및 이전 버전의 SUSE Linux Enterprise 11.4에서도 동일한 문제가 발생합니다(Putty를 통한 SSH 세션만 시도).

CentOS 6/7 및 Mint 19(bash 사용)는 출력을 명령이나 파일로 리디렉션할 때 예상대로 작동합니다. 각 출력 화면의 헤더 라인을 볼 수 있기 때문입니다.

CentOS/Mint의 grep은 여러 헤더 행을 볼 수 있지만 이것이 openSUSE에서 기대할 수 있는 것입니다.

[dave@centos1 ~]$ ps aux --headers | egrep RSS  
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dave      3682  0.0  0.0   4424   816 pts/0    S+   11:58   0:00 egrep RSS
[dave@centos1 ~]$

리디렉션으로 인해 추가/후속 헤더 행이 리디렉션 출력에서 ​​사라지는 이유에 대한 팁/설명을 주시면 감사하겠습니다.

답변1

터미널에서 출력을 리디렉션하고 있습니다. 따라서 ps명령에는 더 이상 디스플레이 크기에 대한 정보가 포함되지 않으므로 디스플레이가 매우 넓고 매우 길다고 가정합니다. 결국 파일로 리디렉션하고 다른 크기의 터미널에서 해당 파일을 보면 이전 터미널의 크기 가정이 더 이상 적용되지 않습니다. 호출기와 첫 번째 화면을 탐색한 후 창 크기를 조정하면 이전 크기 가정이 더 이상 적용되지 않는 경우에도 의미가 없을 수 있습니다.

답변2

ps는 stdout(OpenSuse의 경우)과 다른 시스템의 stderr에서 화면 크기를 가져옵니다. 여기서는 문제가 보이지 않습니다. 단지 행동의 편차일 뿐입니다. 이러한 추가 줄이 정말로 필요한 경우 awk 스크립트를 사용하십시오.

lines=$(tput lines); ps ax | awk 'BEGIN {lines='$lines'-2} NR==1 {l=$0;print;next} (NR-1)%lines==0 { print l} { print }'

관련 정보