Há mais informações no /proc/<pid>Linux, basta dar uma olhada.
Em outros Unixes, as coisas podem ser diferentes. O pscomando funcionará em qualquer lugar, o /procmaterial é específico do sistema operacional. Por exemplo, em AIX não existe cmdlineno /proc.
no linux, você provavelmente precisará de -ww (ie ps -ww -fp <pid>) para especificar uma saída ampla, pois se houver vários comandos, eles poderão ser cortados.
cat /proc/<pid>/cmdlinetambém funciona no Cygwin, onde os argumentos da linha cmd não são mostrados pscom nenhuma opção.
Lechup
3
No Linux, se você precisar apenas obter o args, o comando é ps -o args -p <pid>e ele imprimirá apenas o comando args-ocmd se você precisar apenas ver o cmd. Tentar ler /proc/<pid>/cmdlinenem sempre funcionará para usuários sem privilégios. O psutilitário irá funcionar.
alvits
2
Dica: o comprimento de /proc/<pid>/cmdlineé limitado (codificado no valor do parâmetro PAGE_SIZE do kernel), portanto, linhas de comando mais longas ainda são mostradas truncadas! Consulte stackoverflow.com/questions/199130/… para obter mais informações. Você pode consultar a configuração do seu kernel getconf PAGE_SIZE, geralmente é 4096.
t0r0X
61
Isto irá fazer o truque:
xargs -0 < /proc/<pid>/cmdline
Sem os xargs, não haverá espaços entre os argumentos, porque eles foram convertidos em NULs.
O espaço em branco não é removido, é substituído por NULs.
5159 bdonlan
Ah, eu não verifiquei isso. Boa pegada!
5309 lothar
4
xargs -0 eco </ proc / <pid> / cmdline. Você também pode fazer isso com / proc / <pid> / environ também, embora queira adicionar -n 1 para isso.
Camh 5/05
No meu sistema não há proc filesystem :( qualquer outra solução /?
Hemant
O meu é um processo java com parâmetros muito longos. Ainda está truncando minha saída. Algum conselho?
precisa saber é
14
Você pode usar pgrepcom -f(linha de comando completa) e -l(descrição longa):
pgrep -l -f PatternOfProcess
Este método tem uma diferença crucial com qualquer uma das outras respostas: funciona no CygWin , para que você possa usá-lo para obter a linha de comando completa de qualquer processo em execução no Windows (execute como elevado se desejar dados sobre qualquer processo elevado / administrativo) . Qualquer outro método para fazer isso no Windows é mais complicado ( por exemplo ).
Além disso: nos meus testes, a maneira pgrep foi o único sistema que trabalhou para obter o caminho completo para scripts em execução no python do CygWin .
Este realmente imprime o nome do executável original também:$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
unhammer
Não funciona para mim usando pgrep from procps-ng 3.3.15e 3.3.12. Apenas imprime o nome pid e prorgam sem argumentos.
Socowi 20/09/19
4
Outra variante de impressão /proc/PID/cmdlinecom espaços no Linux é:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Dessa forma, catimprime caracteres NULL como ^@e, em seguida, você os substitui por um espaço usando sed; echoimprime uma nova linha.
Para sua informação, você também pode usar cat -v / proc / PID / cmdline | \ 's / \ n / g' de sed . Isso substituirá o caractere nulo por um caractere de nova linha. Ao fazer isso, cada argumento será impresso em sua própria linha. Dessa forma, é mais fácil distinguir um argumento de outro.
Além de todas as maneiras acima para converter o texto, se você simplesmente usar 'strings', ele produzirá a saída em linhas separadas por padrão. Com o benefício adicional, ele também pode impedir a exibição de caracteres que possam embaralhar seu terminal.
Ambos emitem em um comando:
strings / proc // cmdline / proc // environ
A verdadeira questão é ... existe uma maneira de ver a linha de comando real de um processo no Linux que foi alterada para que o cmdline contenha o texto alterado em vez do comando real que foi executado.
tr \\0 ' ' < /proc/<pid>/cmdline
Respostas:
Existem várias opções:
Há mais informações no
/proc/<pid>
Linux, basta dar uma olhada.Em outros Unixes, as coisas podem ser diferentes. O
ps
comando funcionará em qualquer lugar, o/proc
material é específico do sistema operacional. Por exemplo, em AIX não existecmdline
no/proc
.fonte
ps -ww -fp <pid>
) para especificar uma saída ampla, pois se houver vários comandos, eles poderão ser cortados.-ww
opção permite acesso a argumentos completos da linha de comando (o máximo que é armazenado pelo kernel). Veja também: como o solaris e o bsd obtêm os parâmetros da linha de comando não truncados para as opções decat /proc/<pid>/cmdline
também funciona no Cygwin, onde os argumentos da linha cmd não são mostradosps
com nenhuma opção.args
, o comando éps -o args -p <pid>
e ele imprimirá apenas o comandoargs
-ocmd
se você precisar apenas ver ocmd
. Tentar ler/proc/<pid>/cmdline
nem sempre funcionará para usuários sem privilégios. Ops
utilitário irá funcionar./proc/<pid>/cmdline
é limitado (codificado no valor do parâmetro PAGE_SIZE do kernel), portanto, linhas de comando mais longas ainda são mostradas truncadas! Consulte stackoverflow.com/questions/199130/… para obter mais informações. Você pode consultar a configuração do seu kernelgetconf PAGE_SIZE
, geralmente é 4096.Isto irá fazer o truque:
Sem os xargs, não haverá espaços entre os argumentos, porque eles foram convertidos em NULs.
fonte
xargs -0 < /proc/<pid>/cmdline
.Linha de comando completa
Para Linux e Unix System, você pode usar
ps -ef | grep process_name
para obter a linha de comando completa.Nos sistemas SunOS, se você deseja obter uma linha de comando completa, pode usar
Para obter a linha de comando completa, você precisa se tornar superusuário.
Lista de argumentos
fornecerá uma lista detalhada de argumentos passados para um processo. Ele produzirá a matriz de argumentos da seguinte maneira:
Não encontrei nenhum comando semelhante para Linux, mas usaria o seguinte comando para obter resultados semelhantes:
fonte
No Linux
get é a linha de comando do processo (incluindo args), mas com todos os espaços em branco alterados para caracteres NUL.
fonte
Você pode usar
pgrep
com-f
(linha de comando completa) e-l
(descrição longa):Este método tem uma diferença crucial com qualquer uma das outras respostas: funciona no CygWin , para que você possa usá-lo para obter a linha de comando completa de qualquer processo em execução no Windows (execute como elevado se desejar dados sobre qualquer processo elevado / administrativo) . Qualquer outro método para fazer isso no Windows é mais complicado ( por exemplo ).
Além disso: nos meus testes, a maneira pgrep foi o único sistema que trabalhou para obter o caminho completo para scripts em execução no python do CygWin .
fonte
$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
pgrep from procps-ng 3.3.15
e3.3.12
. Apenas imprime o nome pid e prorgam sem argumentos.Outra variante de impressão
/proc/PID/cmdline
com espaços no Linux é:Dessa forma,
cat
imprime caracteres NULL como^@
e, em seguida, você os substitui por um espaço usandosed
;echo
imprime uma nova linha.fonte
Você pode simplesmente usar:
fonte
Em vez de usar vários comandos para editar o fluxo, use apenas um - tr converte um caractere para outro:
fonte
Além de todas as maneiras acima para converter o texto, se você simplesmente usar 'strings', ele produzirá a saída em linhas separadas por padrão. Com o benefício adicional, ele também pode impedir a exibição de caracteres que possam embaralhar seu terminal.
Ambos emitem em um comando:
strings / proc // cmdline / proc // environ
A verdadeira questão é ... existe uma maneira de ver a linha de comando real de um processo no Linux que foi alterada para que o cmdline contenha o texto alterado em vez do comando real que foi executado.
fonte
No Solaris
similar pode ser usado em sistemas como o Unix.
fonte
No Linux, com bash, para produzir como args entre aspas, para que você possa editar o comando e executá-lo novamente
No Solaris, com bash (testado com a versão 3.2.51 (1)) e sem a terra do usuário do gnu:
Exemplo de Linux bash (cole no terminal):
Resultado:
Exemplo do Solaris Bash:
Resultado:
fonte
Se você deseja obter o máximo de tempo possível (sem saber quais são os limites), semelhante ao pargs do Solaris , você pode usá-lo no Linux e OSX:
fonte
tente
ps -n
em um terminal linux. Isso mostrará:1.Todos os processos em execução , sua linha de comandos e seus PIDs
Depois você saberá qual processo matar
fonte