以下は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 }'