Linux 线程或分叉进程可能会更改文件系统ps
中可见的名称和/或其命令行/proc
。
使用该python-setproctitle
包时,相同的更改发生在/proc/pid/cmdline
、/proc/pid/comm
、和 的第二个字段中Name:
,其中仅显示完整长度,其他三个位置显示更改名称的前 15 个字符。/proc/pid/status
/proc/pid/stat
cmdline
当观察多线程ruby
进程时,看起来/proc/pid/cmdline
保持不变,但其他三个位置显示线程名称,被截断为 15 个字符。
man prctl
告诉 是/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
all shown之外的三个位置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
对其进行转义(替换特殊字符),其他则不转义。