추가 읽기

추가 읽기

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

그러나 내가 알아차린 한 가지 차이점은 우리가 처음으로 tmux 세션을 시작하면

tmux new -s foo

그 다음에

ps aux | grep tmux

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

pgrep -l tmux

할 수 있다. 하지만 그래도 tmux 서버 프로세스를 볼 수 있도록 ps플래그 를 지정하는 것은 어떨까요 ? 이들with 그리고 의 차이점은 무엇인가요 ?greppgreppsgreppgrep

답변1

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

의 출력은 ps다음과 같습니다기계로 분석할 수 없음. 여러 필드에 다음이 포함될 수 있습니다.인코딩되지 않은 공백임의 길이의 공백이 있기 때문에 필드 경계를 안정적으로 결정하는 것이 불가능합니다.또한필드 구분 기호. args실제로 comm그러한 두 가지 분야가 있습니다. 의 출력은 ps사람만이 읽을 수 있습니다.

grep따라서 출력이 전체 라인과 일치하는 패턴 일 때 ps해당 패턴을 관련 특정 필드에 고정할 수 있는 신뢰할 수 있는 방법이 없습니다.제외하고유용하고 애초에 이 방법으로 찾으려고 할 수 있는 다른 모든 항목을 거의 모두 제거합니다.

예를 들어:

%ps -a -x -e -o sid,comm,args |
  grep dbus-데몬 |
  머리 -n 4
   25 nosh cyclolog 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 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
%

추가 읽기

관련 정보