추가 읽기

추가 읽기

pgrep필요한가요? psand 를 함께 사용할 수 있다면 grep왜 필요한가요 pgrep? 또는 명령이 있으면 lsgrep이상할 것입니다 curlgrep.

하지만 제가 알아차린 한 가지 차이점은 다음을 사용하여 tmux 세션을 처음 시작하면

tmux new -s foo

그 다음에

ps aux | grep tmux

tmux 서버 프로세스를 찾을 수 없지만

pgrep -l tmux

할 수 있는. 그런데 tmux 서버 프로세스를 볼 수 ps있도록 플래그가 없는 이유는 무엇입니까 ? 이들 그리고 그리고 의 차이점은 무엇인가요 ?greppgreppsgreppgrep

답변1

명령 ps에는 일반적으로 사람들이 이런 방식으로 검색하는 두 개의 필드, 즉 args및 가 있습니다 comm. 첫 번째는 NUL로 구분된 프로그램 매개변수 문자열입니다. 두 번째는 프로그램의 "이름"입니다. 이는 별도로 저장되며 (다양한 운영 체제에서)둘 다런타임 시 프로그램 자체에 의해 변경됩니다. 이와 같은 프로그램이 tmux바로 그 일을 합니다.

의 출력은 ps다음과 같습니다기계로 구문 분석할 수 없음. 여러 필드에 다음이 포함될 수 있습니다.인코딩되지 않은 공백이로 인해 필드 경계를 확실하게 결정하는 것이 불가능해집니다. 왜냐하면 어떤 길이의 공백도 허용되지 않기 때문입니다.반품필드 구분 기호. 실제로 그러한 영역이 두 가지 args있습니다 comm. 출력 ps은 사람이 읽을 수만 있습니다.

따라서 grep출력이 ps전체 행과 일치하는 패턴인 경우 해당 패턴을 문제의 특정 필드에 고정할 수 있는 안정적인 방법이 없습니다.와는 별개로유용하고 처음에 이 방법을 통해 찾으려고 할 수 있는 거의 모든 것을 제거합니다.

몇 가지 예:

%ps -a -x -e -o sid,comm,args | ps -a -x -e -o sid,comm,args |
  grep dbus 데몬 |
  헤더 -n 4
   25 nosh 사이클로그 dbus-daemon/(nosh)
   25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket
  989 장 dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus
15107 grep grep dbus 데몬
%
%Clearenv --keep-path \
  setenv WIBBLE tmux \
  ps -a -x -e -o sid,comm,명령 |
  grep tmux
15107 ps 경로=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,command
%

즉, grep줄이 포함된 텍스트 파일에 대해 작업하는 데 사용됩니다. 프로세스 테이블은 텍스트 파일이 아니며 텍스트 파일로 처리하면(명령을 사용하여 변환 ps) 필드에 대한 정보가 손실됩니다.

이러한 유형의 검색을 수행하는 방법은 프로세스 테이블을 보는 것 이외의 다른 방법을 사용하는 것입니다 ps. Linux에서는 /proc/${PID}/comm매개변수 문자열, 환경 문자열 등에 대한 유사한 의사 파일을 직접 볼 수 있습니다.

아니면 낚시 도구를 작성할 수도 있습니다.일치해야 하는 특정 데이터프로세스 테이블에서 가져오고 해당 필드에서만 패턴 처리를 실행합니다. 이 도구는 텍스트 파일에서는 작동하지 않지만 프로세스 테이블에서는 작동합니다. 당신은 그것을 호출할 수 있습니다 pgrep.

물론, 꽉 쥔 손에 다음 ps과 같은 결과가 나오는 것을 쓸 수 있습니다.할 수 있는(예를 들어) 프로세스를 진행 awk하기 때문에정확하게 식별할 수 있는 필드를 vis()제공하기 위해 공백을 인코딩하여 기계가 읽을 수 있습니다 . awk단점은 상대적으로 양이 적다는거인류- 읽을 수 있지만 사양 준수 버전과 완전히 동일하지는 않습니다 ps. 나는 그 출력을 console-flat-table-viewer읽기 위해 전달합니다. ☺

%시스템 제어 ps -p 740 -o sid,comm,args
SID 명령 명령
25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket'
%
%시스템 제어 ps -A -o sid,comm,args,envs,tree |
  awk '{ if ("dbus-daemon"==$2) $3 인쇄 }'
dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket'
dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus'
/usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--인쇄-주소\0407\040--세션
%
%시스템 제어 ps -A -o sid,comm,args,envs,tree |
  awk '{ if ("dbus-daemon"==$2) $3 인쇄 }' |
  유엔 바이스
dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket'
dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus'
/usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
%

추가 읽기

관련 정보