"사용자" 열의 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.c보다는 procps-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 기능을 단계별로 실행하기를 원하시면(명확하지 않은 경우) 알려주시기 바랍니다.

관련 정보