결론적으로

결론적으로

나는 최근에 pidof그것을 배우고 비교했습니다 pgrep. 이 작업을 수행하는 동안 pidofFirefox가 여러 PID를 반환하고 pgrep하나만 반환 한다는 것을 알았습니다 .

pgrep매뉴얼 페이지를 확인 하고 토글을 시도한 결과 예상되는 결과를 얻었습니다 -f.

   -f, --full
          The pattern is normally only matched against the process name.  
          When -f is set, the full command line is used.

ps이제는 명령의 전체 경로, "단순" 명령 이름(예: basename전체 경로) 및 전체 명령 이름을 구별하는 방법을 알고 있지만 args프로세스 이름은 들어본 적이 없습니다.

아래 예에서 다른 모든 프로세스는 의 하위 프로세스 4661이므로 Firefox가 다중 처리를 활용하기 위해 포크한 것으로 추측됩니다.

그래서 여기에 질문이 옵니다:

  • 프로세스 이름이란 무엇입니까?
  • 프로세스에서 이를 설정하는 방법과 이유는 무엇입니까?

보고 있다이것들 우편argv[0], 변경하거나 호출하여 수행 될 수도 있고 수행되지 않을 수도 있는 것으로 보이며 prctl(PR_SET_NAME)디버깅을 돕고, 어떤 하위 프로세스가 무엇을 수행하고 있는지 식별하는 데만 사용됩니다(때로는 사용자가 프로세스가 다른 프로세스라고 생각하도록 속입니다).

그렇습니까? 아니면 프로세스 이름이 가 아닌 다른 이름입니까 argv?

$ pidof firefox
5495 5463 5391 5384 5380 5351 5330 5311 5239 5184 4661
$ pgrep firefox
4661
$ pgrep -f firefox
4661
5184
5239
5311
5330
5351
5380
5384
5391
5463
5495
$ pgrep -fl firefox
4661 firefox
5184 Web Content
5239 Web Content
5311 Web Content
5330 Web Content
5351 Web Content
5380 Web Content
5384 Web Content
5391 Web Content
5463 Privileged Cont
5495 WebExtensions
$ 

답변1

대부분의 exec함수는 최소한 두 개의 인수를 받습니다. 그 중 첫 번째는 실행 파일의 경로이고 두 번째는 인수 목록입니다. 목록은 포함되어 있으므로 argv[0]프로그래머는 항상 목록을 변경할 수 있습니다. 그게 다야bash 하다을 위한 exec -a new_name. 따라서 argv[0]의도된 실행 파일을 계속 가리키면서 프로세스의 부모를 정의할 수 있습니다 .

Firefox는 원래 질문에서 프로세스 이름을 다음으로 변경합니다.부르다 prctl (PR_SET_NAME,...). 에 따르면 prctl(2)스레드 이름을 설정합니다.

이 속성은 pthread_setname_np(3)로 설정하고 pthread_getname_np(3)로 검색할 수 있는 속성과 동일합니다. 이 속성은 /proc/self/task/[tid]/comm(proc(5) 참조)을 통해서도 액세스할 수 있습니다. 여기서 [tid]는 gettid(2)에서 반환된 호출 스레드의 스레드 ID입니다.

이렇게 한 이유에 대해 말하자면,암호다음과 같은 의견이 있습니다.

// Update the process name so about:memory's process names are more obvious.

man 5 proc여기에서 매우 유용합니다. 의 경우 cmdline프로그램이 이를 변경할 수 있는 몇 가지 방법을 설명하고 파일을 '이 파일을 프로세스가 보기를 원하는 명령줄로 생각하세요.'. comm'로 정의된다프로세스와 관련된 명령 이름' 그리고 변경하는 방법도 설명되어 있습니다.

따라서 "프로세스 이름 변경"에는 최소한 두 가지 방법이 있으며, 각 방법은 서로 다른 방식으로 만들고 작동합니다 pidof.pgrep

  • 이 방법은 프로세스가 시작될 때 또는 그 후에 프로세스를 변경 argv[0]하고 영향을 미칩니다.argv/proc/PID/cmdline
  • 실제로 prctl (PR_SET_NAME,...)프로세스의 메인 스레드 이름을 변경하고 /proc/PID/comm두 스레드 모두 에 영향을 미칩니다./proc/PID/task/PID/comm
무엇 argv[0] prctl (PR_SET_NAME,...)
pidof 독창적이고 새로운 것 원본만
pgrep 원본만 새 제품만
pgrep -f 새 제품만 원본만
ps -o comm 원래 새로운
ps -o cmd 새로운 원래

pidof, ps, top분명 pgrep다 거기 있을 거야procps-ng프로젝트.

pidof 조사하다실제 바이너리 cmdline에 대한 링크 이므로 해당 메서드의 원래 메서드와 새 메서드 /proc/PID/exe모두에 대해 작동 argv[0]하지만 다른 메서드의 원래 메서드에만 작동합니다.

결론적으로

pgrep매뉴얼 페이지의 내용프로세스 이름/proc/PID/comm. 이는 argv[0]에 저장된 이름과 반드시 ​​동일할 필요는 없으며 /proc/PID/cmdline두 이름 모두 다양한 방법으로 독립적으로 변경될 수 있습니다.

분명히 이 기능의 주요 용도는 디버깅과 유지 관리의 용이성입니다.

관련 정보