왜 pgrep
필요한가요? ps
and 를 함께 사용할 수 있다면 grep
왜 필요한가요 pgrep
? 또는 명령이 있으면 lsgrep
이상할 것입니다 curlgrep
.
하지만 제가 알아차린 한 가지 차이점은 다음을 사용하여 tmux 세션을 처음 시작하면
tmux new -s foo
그 다음에
ps aux | grep tmux
tmux 서버 프로세스를 찾을 수 없지만
pgrep -l tmux
할 수 있는. 그런데 tmux 서버 프로세스를 볼 수 ps
있도록 플래그가 없는 이유는 무엇입니까 ? 이들 그리고 그리고 의 차이점은 무엇인가요 ?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 | ps -ef의 차이점은 무엇입니까? grep WDA 및 ps -ef grep [W]DA?","프로그램명에 걸맞게 클릭률이 왜 이렇게 높은 걸까요?","`ps | grep -v |", 그리고많은다른 곳)은 물론 프로세스 자체
grep
에 전달되는 모드입니다 .grep
args
- 환경 문자열과 일치하는 경우도 발생할 수 있는데, 이는 환경 변수 에서 자주 발견되는 내용을 고려하면
_
특히 가슴 아픈 일입니다 .
%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 %
추가 읽기
ps
.NetBSD 공통 명령 매뉴얼. 2016년 12월 2일.vis
.NetBSD 라이브러리 기능 매뉴얼. 2017년 4월 22일.- 슬로미 노치(2009-10-01). mysqld가 아직 살아 있는지 테스트하지 않는 방법. code.openark.org.
- 그렉 울리지. "프로세스 트리 구문 분석의 위험".공정 관리. 그렉의 위키.
- 조나단 데보인 폴라드(2015).
clearenv
.스낵 가이드. 소프트웨어. - 조나단 데보인 폴라드(2015).
setenv
.스낵 가이드. 소프트웨어. - 조나단 드보인 폴라드(2020).
ps
.스낵 가이드. 소프트웨어. - 조나단 드보인 폴라드(2020).
list-process-table
.스낵 가이드. 소프트웨어.