Como posso obter os argumentos de comando ou toda a linha de comando de um processo em execução usando seu nome de processo?
Por exemplo, este processo:
# ps
PID USER TIME COMMAND
1452 root 0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
E o que eu quero é /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
ou os argumentos. Eu sei o nome do processo e quero seus argumentos. Estou usando o Busybox no SliTaz.
ps
(não recomendado) ou está procurando algum comando alternativo paraps
fornecer a saída? O que precisa ser feito quandops
fornece várias linhas de saída? imprimir tudo / primeiro / último?arg
comocommand
por resposta @John ?pidof <process name>
ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Mas desta maneira não recebo os argumentos em uma variávelRespostas:
Você pode usar o
-o
switch para especificar seu formato de saída:Na página do manual :
Você também pode usar a
-p
opção para selecionar um PID específico:pidof
também pode ser usado para alternar do nome do processo para o PID, permitindo o uso de-p
com um nome:Obviamente, você também pode usar
grep
para isso (nesse caso, você deve adicionar a-e
opção):O GNU ps também permitirá que você remova os cabeçalhos (é claro, isso é desnecessário ao usar
grep
):Em outros sistemas, você pode canalizar para AWK ou sed:
Edit: se você quiser pegar esta linha em uma variável, use
$(...)
como de costume:ou com
grep
:fonte
args
porcommand
(oucmd
).cmd
ecommand
são aliases paraargs
, isso provavelmente é desnecessário.grep
para pegar a linha que você está realmente interessado em:ps -eo args | grep dhcpcd | head -n -1
. Eu editei minha resposta.Tente algo como isto:
(exemplo de saída do busybox no OpenWrt em um dos meus roteadores)
/proc/$PID/cmdline
contém os argumentos do processo$PID
como uma string C-ish, um após o outro. Cada sequência é zero terminada.As citações apresentam alguns argumentos ou opções como itens de concha. Você precisa olhar mais de perto as linhas que estão sendo mostradas e onde são usados espaços ou outros caracteres com significado especial para o shell. Você precisará citar os caracteres de alguma forma ou o argumento completo ao associar essas linhas a uma linha de comando novamente.
fonte
tr "\0" " " </proc/991/cmdline
\0
por `` ser ruim, mas achotr '\0' '\n' < /proc/$foo/cmdline
que é um pouco mais simples quexargs
.printf
facilita adicionar aspas à saída, inserir um espaço em vez da nova linha e assim por diante. Ao pensar em adicionar mais processamento, o caminhoprintf
é um bom começo.Método # 1 - Usando ps
Você poderia usar
ps -eaf | grep 1234
.Exemplo
NOTA: O Busybox
ps
não inclui os-eaf
switches, como mostrado acima, de um típicops
incluído na maioria dos Linux, no entanto, o Busyboxps
mostra o que parece ser uma saída muito semelhante ao exemplo que forneci. Você pode instalar o Busybox na maioria dos Linux e executá-lo da seguinte maneira:Método # 2 - Usando / proc
Você também pode examinar o
cmdline
arquivo em que cada PID possui/proc/<pid>
.Mas observe que está faltando o espaçamento. Isso ocorre porque um caractere NUL está sendo usado neste arquivo para separar os argumentos da linha de comando. Não se preocupe, porém, estes podem ser retirados.
Referências
fonte
Conhecendo o PID, apenas exec
Por exemplo, para PID = 127
fonte