최근에 이 명령을 실험했는데 ps
때로는 매우 긴 경로가 다음 줄(또는 두 줄)로 넘어가 읽기 어렵게 만드는 경우가 있었습니다. 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가 필요하다는 것입니다 . 위의 두 가지 방법으로 이 문제를 해결할 수 있습니다.
또 다른 옵션이 있습니다. 위 명령에서 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
넓은 출력. 무한한 너비를 얻으려면 이 옵션을 두 번 사용하십시오.
-w
넓은 출력. 무한한 너비를 얻으려면 이 옵션을 두 번 사용하십시오.
--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=