다음은 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 }'