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 variantepgrep 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
estrace
:
htop
É uma variante detop
com interface do usuário e configurabilidade aprimoradas, além de alguns extras:
Escolha um processo com a linha do cursor e pressione L paraltrace
, ou s parastrace
!