Um thread ou processo bifurcado do Linux pode alterar seu nome e/ou sua linha de comando conforme visível por ps
ou no /proc
sistema de arquivos.
Ao utilizar o python-setproctitle
pacote, a mesma alteração ocorre em /proc/pid/cmdline
, /proc/pid/comm
, na Name:
linha de /proc/pid/status
e no segundo campo de /proc/pid/stat
, onde apenas cmdline
está mostrando o comprimento completo e os outros três locais estão mostrando os primeiros 15 caracteres do nome alterado.
Ao observar processos multithread ruby
, parece que /proc/pid/cmdline
permanece inalterado, mas os outros três locais mostram um nome de thread, truncado para 15 caracteres.
man prctl
informa que /proc/pid/comm
é modificado pela PR_SET_NAME
operação do prctl
syscall, mas não diz nada sobre /proc/pid/status
and /proc/pid/stat
.
man proc
Tell /proc/pid/comm
fornece um superconjunto do prctl PR_SET_NAME
qual não é mais explicado.
E informa que o segundo campo /proc/pid/stat
ainda estará disponível mesmo se o processo for trocado.
Ao observar os processos JVM, todos os locais mencionados fornecem conteúdos idênticos para todos os threads (os três locais diferentes de cmdline
all shows java
), mas jcmd pid Thread.print
ainda mostram nomes de threads diferentes para os threads existentes, então parece que os threads Java estão usando algum mecanismo não padrão para mudar seu nome.
É /proc/pid/comm
sempre idêntico à Name:
linha /proc/pid/status
e ao segundo campo de /proc/pid/stat
ou há circunstâncias em que um destes três locais oferece conteúdos diferentes?
Forneça um exemplo (fácil de reproduzir) se houver possíveis diferenças.
Todas as três entradas são definidas juntas na fonte do kernel:
comm
,stat
estatus
. Trabalhando a partir daí,comm
são tratadas ascomm_show
chamadasproc_task_name
para determinar o nome da tarefa.stat
é tratado porproc_tgid_stat
, que é um wrapper finodo_task_stat
, que chamaproc_task_name
para determinar o nome da tarefa.status
é tratado porproc_pid_status
, que também chamaproc_task_name
para determinar o nome da tarefa.Então sim,
comm
a linha “Nome”status
e o segundo campo destat
todos mostram o mesmo valor. As únicas variações são se o valor tem escape ou não:status
escapa (substituindo caracteres especiais), os outros não.