ps
Linux 线程或分叉进程可能会更改文件系统中可见的名称和/或其命令行/proc
。
使用该python-setproctitle
包时,相同的更改发生在/proc/pid/cmdline
、/proc/pid/comm
、和Name:
的/proc/pid/status
第二个字段中/proc/pid/stat
,其中仅cmdline
显示完整长度,其他三个位置显示更改名称的前 15 个字符。
当观察多线程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
即使进程被换出,第二个字段仍然可用。
cmdline
在观察 JVM 进程时,所有提到的位置都为所有线程提供了相同的内容(除了all shown之外的三个位置java
),但jcmd pid Thread.print
仍然为现有线程显示不同的线程名称,因此看起来 Java 线程正在使用某种非标准机制来改变他们的名字。
的行和第二个字段/proc/pid/comm
始终相同,或者是否存在这三个地方之一提供不同内容的情况?
如果可能存在差异,请提供一个(易于重现)示例。Name:
/proc/pid/status
/proc/pid/stat
所有三个条目都在内核源代码中紧密定义:
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
对其进行转义(替换特殊字符),其他则不转义。