그 남자는 pgrep
옵션에 대해 다음과 같이 말했습니다 -f
.
-f The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
전체 명령줄을 사용한다는 것은 무엇을 의미합니까?
답변1
즉, Without는 명령 이름에서 제공된 정규식 -f
만 검색하는 반면, 정규식을 사용하면 해당 인수에서 검색합니다(여기서 첫 번째 인수( )는 반드시 명령 이름과 동일할 필요는 없음).pgrep
-f
argv[0]
$ sleep 2000 &
[1] 15768
$ pgrep 2000
$ pgrep -f 2000
15768
's를 사용할 때와 다른 명령 이름이 나타나는 경우 argv[0]
(Linux에서):/proc/$pid/stat
zsh
ARGV0
$ ARGV0=foo sleep 2000 &
[2] 15881
$ ps -fp $!
UID PID PPID C STIME TTY TIME CMD
chazelas 15881 13126 0 19:55 pts/1 00:00:00 foo 2000
$ ps -o comm= $!
sleep
$ awk '{print $2}' /proc/$!/stat
(sleep)
$ pgrep foo
$ pgrep sleep
15881
$ pgrep -f sleep
$ pgrep -f foo
15881
Unix와 Linux의 프로세스 이름에 대해 많은 잠재적인 혼란이 있습니다. 프로세스에는 프로세스 이름으로 선언할 수 있는 3가지 속성이 있습니다.
- 프로세스가 실행한 마지막 execve(2) 시스템 호출에 전달된 실행 파일의 기본 이름입니다. Linux에서는
ps
에서 보고되거나 발견된 대로 프로세스 이름을 초기화하는 데 사용됩니다/proc/$pid/stat
. 하지만 Linux에서는prctl(PR_SET_NAME...)
. - 프로세스에서 현재 실행 중인 실행 파일에 대한 모든 경로
mmap
, 바람직하게는 호출 시 경로입니다(예를 들어 스크립트의 경우 shebang 줄에 제공된 경로입니다). Linux에서는readlink
또는 를 사용하여 얻을 수 있습니다/proc/$pid/exe
. 즉, 다른 것을 호출하지 않고는 변경할 수 없습니다.execve
(이론적으로는 호출하지 않고 메모리에 새 실행 파일을 로드하고 해당 코드를 실행할 수 있지만execve
예를 들어 몇 가지 시도를 참조하세요.사용자 토지 집행). - 첫 번째 매개변수는 execve 시스템 호출과 함께 전달됩니다. 관례적으로 이 매개변수는 응용 프로그램에 이름을 알려주어 그에 따라 작동하는 방법을 알도록 하기 위한 것이므로 일반적으로 프로세스 이름이 의미하는 것입니다. Linux에서는 에서 찾을 수 있지만
/proc/$pid/cmdline
프로세스가 가리키는 메모리를 수정하여 이를 변경할 수도 있습니다argv[0]
.
또한 다양한 Unices 간에는 많은 차이점이 있다는 점에 유의해야 합니다.
답변2
그렇게 하면 ps -f
관련 명령 및 프로세스 정보를 포함하여 프로세스에 대한 자세한 내용이 표시됩니다. 또는 를 사용하면 pgrep -f
표시된 정보 대신 검색어와 일치하는 추가 정보를 검색합니다.ps
ps -e