「ユーザー」列のps列幅を増やす方法は?

「ユーザー」列のps列幅を増やす方法は?

私はこのパターンが好きですps aux | grep something

これにより、コマンドのコマンドラインオプションを忘れずに必要な情報を簡単に見つけることができますps

残念ながら、psコマンドはLinuxユーザー名(最初の列)を7文字に切り捨て、+ユーザー名が長い場合を追加します。

私の場合、ユーザー名は「foobar_123」と「foobar_234」と同じであるため、これは重要です。

次のコマンドが利用可能であることを知っていますが、パターンを引き続き使用できる場合は良いでしょうps aux | grep something

ps ax o user:16,pid,pcpu,pmem,vsz,rss,stat,start_time,time,cmd

ps aux | grep somethingユーザー名が削除されないように、設定で上記の形式をどのように取得できますか?

ヒント:「ps ...special...args...を使用」などの回答は上記の質問と一致しません。

バージョン: procps-ng バージョン 3.3.5

答え1

複数のオプションを含む長いコマンドが目的の操作を実行していることを知っていますが、毎回入力したくない場合(Bashを使用していると仮定)、次のように作成できます。ニックネームこのコマンドを簡単に作成します。たとえば、

alias ps_mod='ps ax o user:16,pid,pcpu,pmem,vsz,rss,stat,start_time,time,cmd'

次に、この簡単なコマンドを入力します。この行を ~/.bash_profile (またはシステムによって ~/.bashrc) ファイルに追加して、ログイン時に自動的に定義することができます。

Bashを使用しない場合は、シェル関数を定義して同様の操作を実行できます。

答え2

小さなパッチprocps-ngソース

ソースコードへのクイックパッチはトリックを実行しているようです。通常、ユーザー列は8に設定され、以下で説明するように切り捨てられます。

パッチはv3.3.5タグ付きコミット64fa8898に適用されます(上記にリンクされています)。

コンパイルする場合は、最新のソースコードをダウンロードすることをお勧めします - 最新のソースコードをダウンロードするのではなく、ps/output.cprocps-ngソースファイルの "USER"行を以下のように8〜16回に編集することをお勧めします。以前のバージョン(2013年頃)パッチ:

---
 ps/output.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ps/output.c b/ps/output.c
index 9644ed3..41c2eda 100644
--- a/ps/output.c
+++ b/ps/output.c
@@ -1564,7 +1564,7 @@ static const format_struct format_array[] = {
 {"uname",     "USER",    pr_euser,    sr_euser,   8, USR,    DEC, ET|USER}, /* man page misspelling of user? */
 {"upr",       "UPR",     pr_nop,      sr_nop,     3,   0,    BSD, TO|RIGHT}, /*usrpri*/
 {"uprocp",    "UPROCP",  pr_nop,      sr_nop,     8,   0,    BSD, AN|RIGHT},
-{"user",      "USER",    pr_euser,    sr_euser,   8, USR,    U98, ET|USER}, /* BSD n forces this to UID */
+{"user",      "USER",    pr_euser,    sr_euser,  16, USR,    U98, ET|USER}, /* BSD n forces this to UID */
 {"usertime",  "USER",    pr_nop,      sr_nop,     4,   0,    DEC, ET|RIGHT},
 {"usrpri",    "UPR",     pr_nop,      sr_nop,     3,   0,    DEC, TO|RIGHT}, /*upr*/
 {"util",      "C",       pr_c,        sr_pcpu,    2,   0,    SGI, ET|RIGHT}, // not sure about "C"
-- 

付録

ソースによるとps

// The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition)
// requires that user and group names print as decimal numbers if there is
// not enough room in the column.  However, we will now truncate such names
// and provide a visual hint of such truncation.  Hopefully, this will reduce
// the volume of bug reports regarding that former 'feature'.
//
// The UNIX and POSIX way to change column width is to rename it:
//      ps -o pid,user=CumbersomeUserNames -o comm
// The easy way is to directly specify the desired width:
//      ps -o pid,user:19,comm
//

答え3

この質問は2014年askubuntu.comフォーラムで提起されました。

私の解決策は上記のリンクからインスピレーションを得ましたが、少し移植性があります。この機能を.bashrcに追加して使い続けてください!

ps() {
    if [[ $@ =~ .u* || *u ]]; then
        command getent passwd |\
        awk -F':' ' \
        !len || length($1) > len {len=length($1);s=$1}\
        END{print s, len; system("ps axo user:"len",pid,pcpu,pmem,vsz,rss,tty,stat,start,time,comm");}'
    else
        command ps "$@"
    fi
}

ps aux | grep someshit通常どおり ~/.bashrc に上記の機能を追加し、 getent を使用して /etc/passwd で使い慣れた一般ユーザーの方法で決定された最大のユーザー名でフォーマットされた出力をお楽しみください。その後、awkを介してbashを解析すると、関連する整数値を保存するのに役立ちます。最長のユーザー名文字列を使用します。

今私はいつ

$ ps axu | grep this

または

$ ps uaz | grep this

または

$ ps aux | grep this

出力:

thisisareallylonguser 9289 0.0 0.0 23192 4716 pts/6 S 17:59:54 00:00:00 bash

bash機能を段階的に実行したい場合(明確でない場合)に教えてください。

関連情報