como ver o PID para o comando atualmente em execução?

2

enquanto leio sobre linux eu tenho:

By default, variables created within a script are only available to the current shell; child processes (sub-shells) will not have access to values that have been set or modified. Allowing child processes to see the values, requires use of the export command.

Eu tentei encontrar sobre subshells, então me deparei com Existe algum comando para ver como os processos estão funcionando? , e achei que o ltrace poderia ser usado para isso, quando eu procurei como usar ltrace ou strace , achei que PID é necessário atributo para isso.

agora, se eu quiser saber o PID para $ cp file1 file2 , como eu faria isso ?? para que eu possa usar ltrace ?

    
por lazarus 26.09.2014 / 20:42

2 respostas

4

PID do comando atual

O PID de um comando no seu próprio shell é mostrado quando você inicia o comando em segundo plano. Se o comando atual for executado em primeiro plano, o shell geralmente espera que ele termine, temos que esperar também - exceto se quisermos usar uma ferramenta fora desse shell; Veja abaixo para essa opção.

Como exemplo de comando, usarei esse ping que envia uma solicitação a cada 5 segundos por 10 vezes:

ping -i 5 -c 10 example.com 

Agora, vou usar & para executá-lo em segundo plano:

$ ping -i 5 -c 10 example.com &
[1] 12238
$ PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=55 time=118 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=55 time=117 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=55 time=117 ms

O [1] 12238 nos informa que o processo tem o id do processo, curto PID 12238; E esse é o primeiro trabalho em segundo plano atualmente em execução neste shell.

Exemplo: rastreamento de chamadas na biblioteca

No mesmo terminal, obtemos a saída de ping , então é melhor executar o ltrace em outro ( ping tem permissões de raiz especiais, então precisamos que sudo mexa com seu interior):

$ sudo ltrace -p 12238      
[sudo] password for siegel: 
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
gettimeofday(0x7fff7f0b68e0, 0)                                           = 0
sendmsg(3, 0x60a300, 2048, 24)                                            = 64
recvmsg(3, 0x7fff7f0b6970, 0, 0)                                          = 84
__printf_chk(1, 0x40813b, 64, 0x60a560)                                   = 29
__printf_chk(1, 0x4077ea, 4, 28)                                          = 11
__printf_chk(1, 0x40814d, 55, 11)                                         = 7
__printf_chk(1, 0x408162, 118, 7)                                         = 12
_IO_putc('\n', 0x7f7836d89400)                                            = 10
fflush(0x7f7836d89400)                                                    = 0
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
poll(0x7fff7f0b6950, 1, 4880, 0)                                          = 0
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
gettimeofday(0x7fff7f0b68e0, 0)                                           = 0
sendmsg(3, 0x60a300, 2048, 24)                                            = 64
recvmsg(3, 0x7fff7f0b6970, 0, 0)                                          = 84
__printf_chk(1, 0x40813b, 64, 0x60a560)                                   = 29
__printf_chk(1, 0x4077ea, 5, 28)                                          = 11
__printf_chk(1, 0x40814d, 55, 11)                                         = 7
__printf_chk(1, 0x408162, 118, 7)                                         = 12
_IO_putc('\n', 0x7f7836d89400)                                            = 10
fflush(0x7f7836d89400)                                                    = 0
gettimeofday(0x7fff7f0b6900, 0)                                           = 0
poll(0x7fff7f0b6950, 1, 4881, 0)      

Esse é um traço das chamadas da biblioteca durante dois 'pings'.


Encontrando PIDs de processos em execução em geral

Como a questão do título não é muito específica, aqui estão algumas outras maneiras de encontrar PIDs dos comandos atualmente em execução:

  • Pesquise processos pelo nome do comando% pgrep -x cmd Observe que a variante pgrep cmd está errada: ela é usada como substring

  • Pesquise por linha de comando com argumentos em pgrep -f cmdarg

  • Listar os processos que pertencem ao shell (sessão) atual, como os processos em segundo plano, ou o próprio shell em ps -s $$

  • Listar todos os processos: "status do processo"% ps aux

  • Listando os processos de maneira mais interativa: "tabela de processos"
    top

  • E tudo o que você precisa de uma vez: uma tabela de processos, integrada com ltrace e strace :
    htop
    É uma variante de top com interface do usuário e configurabilidade aprimoradas, além de alguns extras:
    Escolha um processo com a linha do cursor e pressione L para ltrace , ou s para strace !

por Volker Siegel 27.09.2014 / 04:03
1

bash , dash (e muitos outros shells) possuem comandos internos para controle de tarefas. Se você executar um comando em segundo plano

sleep 9999 &

você pode descobrir todos os comandos em segundo plano do shell atual:

$ jobs
[1]+  Running                 sleep 9999 &

Se você precisar do ID do processo de um deles, poderá obtê-lo com jobs -p %N , em que N é o ID do trabalho na lista de trabalhos (primeira coluna) acima. Há também uma variável especial $! que o shell substituirá com o PID do comando executado em segundo plano mais recentemente.

Para detalhes e mais opções, dê uma olhada na seção relevante dos manuais de bash(1) ( link direto para a seção de controle de trabalhos na versão HTML ), dash(1) ou sua concha de escolha. O TLDP tem uma ótima seção sobre controle de trabalho também.

    
por David Foerster 28.09.2014 / 21:41