ps -o pid,ppid,stat,exe -e | grep deleted
gera uma saída como esta:
1777 1346 Sl /usr/bin/python3.10 (deleted)
1778 1346 Sl /usr/bin/python3.10 (deleted)
1825 1327 Ss /usr/lib/bluetooth/obexd (deleted)
2007 1 Sl /usr/bin/python3.10 (deleted)
2101 1346 S /usr/bin/python3.10 (deleted)
2199 1 Sl /usr/bin/python3.10 (deleted)
371565 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess (deleted)
371566 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess (deleted)
376426 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess (deleted)
380141 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess (deleted)
O que (deleted)
significa e como posso fazer com que o ps liste o caminho sem anexá-lo?
No Linux,
ps
obtenha essas informações fazendo um arquivoreadlink("/proc/<pid>/exe")
.Esse arquivo é um link simbólico mágico para o arquivo que o processo fornecido (ou qualquer um de seus ancestrais, pois nem todos os processos executam arquivos) foi executado pela última vez . Se o arquivo tiver sido excluído (e potencialmente substituído por uma nova versão, como após uma atualização de pacote), um a
(deleted)
será anexado à string retornada porreadlink()
. Esse link simbólico ainda pode ser seguido para o arquivo excluído real (e dessa forma é mágico ).Nova versão de
sleep
:With
-L
ls
segue o link (usandostat()
em vez delstat()
) e é capaz de obter oi
número do nó correspondente.Vemos que são dois arquivos diferentes (número de inode diferente).
$!
ainda está executando a versão antiga excluída dosleep
, esse arquivo não tem nenhum caminho no sistema de arquivos além do/proc/$!/exe
link simbólico mágico¹./home/chazelas/sleep
agora é um executável diferente, portanto, removê-lo(deleted)
seria errado, pois se referiria ao arquivo errado. Aqui, comoexe
é o último campo, você pode removê-lo canalizando a saída para:Mas, novamente, isso seria uma mentira, pois
/home/chazelas/sleep
não é o executável que o processo 18943 está executando, é outrosleep
comando que agora não foi encontrado em lugar nenhum, pois foi excluído desde que o processo o executou.¹ e correspondente
/proc/<pid>/exe
a outros processos que potencialmente o executam ou/proc/<pid>/fd/<fd>
a processos que têm esse arquivo aberto em algum fd, ou potencialmente alguns links físicos para ele.No seu comando ps , usando o parâmetro exe você pediu para imprimir o caminho do executável.
man proc
contaria mais sobre esse campo:Como isso não é uma opção (ao solicitar que o caminho seja exibido) e você precisa absolutamente que o caminho seja exibido, a única solução que consigo pensar é pós-processar o resultado. Por exemplo usando sed :