最近このコマンドを試しましたが、ps
時には非常に長いパスが次の行(または2行)に渡り、読みにくくなることがありました。ps
出力を別のプログラムにパイプして出力をx
文字数に制限したいと思います。
これまでに行った作業は次のとおりです。しかし、うまく動作しません。
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
これは167と評価されますが、有効な入力ではないようですcut
。
Bashでこのタイプの構文を操作する方法はありますか?
答え1
一部のシェルはzsh
自動的にbash
変数を端末の幅にmksh
設定するため、ここで呼び出す必要はありません。$COLUMNS
stty
私が試したすべての実装は、それps
自体で端末の幅を照会するための非標準(BSDタイプ)構文をサポートしています。そうではないことに驚きました。私が見るものは何ですかCOLUMNS
環境変数がありますが。
だからあなたはこれを行うことができます:
export COLUMNS; ps aux
そうでなければ、
ps aux | cut -c"1-$COLUMNS"
端末にラップしないように指示することもできます。
tput rmam
ps aux
答え2
以下はうまくいきます:
ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)
これはまた働きます:
v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v
stty
問題は、正常に動作するために標準入力にttyが必要であることです。上記の2つの方法でこの問題を解決できます。
別のオプションがあります。上記のコマンドでは、stdinとstdoutの両方がリダイレクトされますが、stty
stderrはそうではありません。それでも端末を指します。奇妙なことに、stty
stderrを入力として与えるとうまくいきます。
ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)
答え3
ps
出力をよりよく処理することもできます。
ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width
ps -ww ${opts} #no word wrap
ps -o ${only_interesting_output} ${opts} #trim output
ps
必要に応じて、出力を仕様に合わせて解析するように求められます。
もちろん改行しないと、情報が失われる問題が発生します。実際に使用するにはすべてのプロセスが必要ですか?もしそうなら、ポケットベルで開いてみてください。
ps ww ${opts} | $PAGER
そうでない場合は、見たい内容を指定してください。
ps -o args= -p $pid
または、ps
端末に明示的に通知することもできます--width
。
man ps
...
w
広い出力。無限の幅を得るには、このオプションを2回使用します。
-w
広い出力。無限の幅を得るには、このオプションを2回使用します。
--width n
画面の幅を設定します。
--width
別途のフィルターや付帯工程なしでお客様が要求する仕様を正確に満たす製品です。(これは-aux
出力をさらに混乱させる可能性があります。)$COLUMNS
上記とStephaneが指摘したように動的に動作します。
|pipe
しかし、人々がしばしばこれらの不要なフィルタを追加してフィットしようとすることは注目に値します。その他フィルタを使用して出力を解析しますが、これは不要な場合があります。もちろん、人々私の言葉は主に私。
上記の出力オペランドを使用すると、表示される列をフィルタリングでき、分布を追加するときに必要に応じて列名を指定することもできます-o
。割り当てを空白にしてターゲットプロセスを提供するため、唯一の出力はコマンド名と呼び出し時に呼び出される名前です。これは、表示する項目と表示しない項目を定義する方法の表面的な部分にすぎません。これが私が推奨する方向です。特に次のようになります。ps
=
-p
$pid
ps
$pid
args
-o
ps
man ps
...
BSD構文を使用して、システム内のすべてのプロセスを確認してください。
ps ax
ps axu
印刷プロセスツリー:
ps -ejH
ps axjf
スレッドに関する情報を取得するには:
ps -eLf
ps axms
セキュリティ情報を取得するには:
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM
ユーザー形式(実際の有効ID)のルートとして実行されているすべてのプロセスを表示するには、次のようにします。
ps -U root -u root u
カスタム形式を使用して各プロセスを表示するには、次の手順を実行します。
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan
syslogdのプロセスIDのみを印刷します。
ps -C syslogd -o pid=
PID 42の名前だけを印刷してください:
ps -p 42 -o comm=