스레드 이름: /proc/pid/comm은 항상 /proc/pid/status의 Name: 행 및 /proc/pid/stat의 두 번째 필드와 동일합니까?

스레드 이름: /proc/pid/comm은 항상 /proc/pid/status의 Name: 행 및 /proc/pid/stat의 두 번째 필드와 동일합니까?

Linux 스레드 또는 포크된 프로세스는 ps파일 시스템 및/또는 해당 명령줄에 표시되는 이름을 변경할 수 있습니다 /proc.

이 패키지를 사용 하면 , , 및 의 두 번째 필드 python-setproctitle에도 동일한 변경이 발생하며 , 여기에는 전체 길이만 표시되고 변경된 이름의 처음 15자가 나머지 3개 위치에 표시됩니다./proc/pid/cmdline/proc/pid/commName:/proc/pid/status/proc/pid/statcmdline

멀티 스레드 프로세스를 보면 ruby모양은 /proc/pid/cmdline동일하게 유지되지만 다른 세 위치에는 15자로 잘린 스레드 이름이 표시됩니다.

man prctlTells는 /proc/pid/comm시스템 호출의 작동에 의해 PR_SET_NAME수정 되지만 및에 대해서는 아무 것도 prctl말하지 않습니다 ./proc/pid/status/proc/pid/stat

man proc/proc/pid/comm슈퍼세트가 제공된다고 하며 더 prctl PR_SET_NAME이상의 설명은 생략하겠습니다.
이는 프로세스가 교체되더라도 두 번째 필드를 /proc/pid/stat계속 사용할 수 있음을 보여줍니다.

JVM 프로세스를 관찰할 때 언급된 모든 위치는 모든 스레드에 동일한 콘텐츠를 제공하지만( cmdline표시된 모든 위치를 제외한 세 위치 java) jcmd pid Thread.print여전히 기존 스레드에 대해 다른 스레드 이름을 표시하므로 Java 스레드가 일부 비표준 메커니즘을 사용하여 이름을 바꾸세요.

행과 두 번째 필드는 항상 /proc/pid/comm동일합니까, 아니면 세 곳 중 하나가 다른 내용을 제공하는 경우가 있습니까? 차이가 있을 수 있는 경우 (쉽게 재현할 수 있는) 예를 제공해 주세요.Name:/proc/pid/status/proc/pid/stat

답변1

세 항목 모두 커널 소스 코드에 엄격하게 정의되어 있습니다.comm,stat, 그리고status. 작업은 거기서부터 시작되어 comm처리됩니다.comm_show어느 전화proc_task_name작업 이름을 결정합니다.stat에 의해 처리됨proc_tgid_stat, 얇은 포장지입니다.do_task_stat, 어느수신 전화proc_task_name작업 이름을 결정합니다. status에 의해 처리됨proc_pid_statusproc_task_name, 작업 이름을 결정하기 위해 호출되기도 합니다 .

그렇습니다 comm. "이름" 행 status과 두 번째 필드는 모두 stat동일한 값을 표시합니다. 유일한 변경 사항은 값이 이스케이프되는지 여부입니다. 값은 status이스케이프되고(특수 문자는 대체됨) 나머지는 그렇지 않습니다.

관련 정보