Linux 스레드 또는 포크된 프로세스는 ps
파일 시스템 및/또는 해당 명령줄에 표시되는 이름을 변경할 수 있습니다 /proc
.
이 패키지를 사용 하면 , , 및 의 두 번째 필드 python-setproctitle
에도 동일한 변경이 발생하며 , 여기에는 전체 길이만 표시되고 변경된 이름의 처음 15자가 나머지 3개 위치에 표시됩니다./proc/pid/cmdline
/proc/pid/comm
Name:
/proc/pid/status
/proc/pid/stat
cmdline
멀티 스레드 프로세스를 보면 ruby
모양은 /proc/pid/cmdline
동일하게 유지되지만 다른 세 위치에는 15자로 잘린 스레드 이름이 표시됩니다.
man prctl
Tells는 /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_status
proc_task_name
, 작업 이름을 결정하기 위해 호출되기도 합니다 .
그렇습니다 comm
. "이름" 행 status
과 두 번째 필드는 모두 stat
동일한 값을 표시합니다. 유일한 변경 사항은 값이 이스케이프되는지 여부입니다. 값은 status
이스케이프되고(특수 문자는 대체됨) 나머지는 그렇지 않습니다.