왜 pgrep
필요합니까? ps
and 를 함께 사용할 수 있다면 grep
왜 필요한가요 pgrep
? lsgrep
또는 명령이 있으면 이상할 것입니다 curlgrep
.
그러나 내가 알아차린 한 가지 차이점은 우리가 처음으로 tmux 세션을 시작하면
tmux new -s foo
그 다음에
ps aux | grep tmux
tmux 서버 프로세스를 찾을 수 없지만
pgrep -l tmux
할 수 있다. 하지만 그래도 tmux 서버 프로세스를 볼 수 있도록 ps
플래그 를 지정하는 것은 어떨까요 ? 이들with 그리고 의 차이점은 무엇인가요 ?grep
pgrep
ps
grep
pgrep
답변1
명령 ps
에는 일반적으로 이러한 방식으로 검색하는 두 개의 필드( args
및 ) 가 있습니다 comm
. 첫 번째는 NUL로 구분된 프로그램 인수 문자열입니다. 두 번째는 프로그램의 "이름"입니다. 이는 별도로 저장되며 (다양한 운영 체제에서)둘 다런타임 시 프로그램 자체에 의해 변경될 수 있습니다. 와 같은 프로그램이 tmux
실제로 그렇게 합니다.
의 출력은 ps
다음과 같습니다기계로 분석할 수 없음. 여러 필드에 다음이 포함될 수 있습니다.인코딩되지 않은 공백임의 길이의 공백이 있기 때문에 필드 경계를 안정적으로 결정하는 것이 불가능합니다.또한필드 구분 기호. args
실제로 comm
그러한 두 가지 분야가 있습니다. 의 출력은 ps
사람만이 읽을 수 있습니다.
grep
따라서 출력이 전체 라인과 일치하는 패턴 일 때 ps
해당 패턴을 관련 특정 필드에 고정할 수 있는 신뢰할 수 있는 방법이 없습니다.제외하고유용하고 애초에 이 방법으로 찾으려고 할 수 있는 다른 모든 항목을 거의 모두 제거합니다.
예를 들어:
- BSD에 있는
u
Linux 옵션을 사용하면 사용자 이름이 포함된 필드가 있으며 , 프로그램 이름을 찾는 패턴도 때때로 일치하게 됩니다.ps
-u
ps
user
grep
- 정식 문제("에 예시됨)ps -ef | grep WDA 및 ps -ef | grep [W]DA?", "프로그램명 매칭, 왜 이렇게 히트작이 많은 걸까?", "`ps의 두 번째 grep 기능 | grep -v | grep`", 그리고많은다른 곳)은 물론 전달된 패턴이 프로세스 자체
grep
와 일치한다는 것입니다 .grep
args
- 환경 문자열과 일치하는 경우도 발생할 수 있는데, 이는
_
환경 변수에서 자주 발견되는 내용을 고려할 때 특히 가슴 아픈 일입니다.
%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 %
추가 읽기
ps
.NetBSD 일반 명령 매뉴얼. 2016-12-02.vis
.NetBSD 라이브러리 함수 매뉴얼. 2017-04-22.- 슬로미 노아치(2009-10-01). mysqld가 살아 있는지 테스트하지 않는 방법. code.openark.org.
- 그렉 울리지. "프로세스 트리를 파싱하는 위험".공정 관리. 그렉의 위키.
- 조나단 드 보인 폴라드(2015).
clearenv
.노쉬 가이드. 소프트웨어. - 조나단 드 보인 폴라드(2015).
setenv
.노쉬 가이드. 소프트웨어. - 조나단 드 보인 폴라드(2020).
ps
.노쉬 가이드. 소프트웨어. - 조나단 드 보인 폴라드(2020).
list-process-table
.노쉬 가이드. 소프트웨어.