O PID de um processo do bash child (imapsync) - como você o obtém?


15

Alguém pode me dizer como obter o PID de um comando executado no bash.

Por exemplo, eu tenho um script bash que executa o imapsync.

Quando o script é finalizado, o processo do imapsync nem sempre é finalizado, então eu gostaria de poder identificar o PID do imapsync programaticamente a partir do meu script, para que eu possa finalizar o processo do imapsync em um manipulador de sinal.

Então, como obtenho programaticamente o PID de um processo filho a partir de um script bash pai?


1
Que tal "pidof imapsync"? O que há de errado com isso?
Pitr

2
Eu não sabia sobre pidof. No entanto, agora que o faço, não é útil para este cenário, até onde posso dizer, porque o pidof parece retornar todos os processos do comando fornecido em um sistema - mesmo aqueles pertencentes a outros scripts / usuários. Além disso, o imapsync é na verdade um script perl, portanto, eu faria um pidof perl, que provavelmente retornará processos que não são imapsync e podem pertencer a outros usuários.
Jason Tan

Javier está correto. Esta página oferecerá mais informações sobre o ProcessManagement .
sinping

Respostas:


4

O imapsync tem uma opção para definir onde seu pid é gravado:

--pidfile: o arquivo em que o imapsync pid está gravado.


FYI isso realmente não respondeu à minha pergunta em um sentido geral, mas eu descobrir a --pidfile arg e com alguma faffing em torno dele tem sido suficiente bom até agora ..
Jason Tan

@JasonTan por que ensinar um homem a pescar, quando você pode lhe dar um saboroso filé pré-cozido, para que ele volte e o chame por mais, amanhã, hein? desculpe pelo post antigo, mas por que aceitar essa resposta sobre a de Javiers?
não sincronizado

46
any_command args &
my_child_PID=$!

O IOW, assim como $$mantém seu PID, $!possui o PID do comando em segundo plano executado mais recentemente .


Obrigado, mas o imapsync não possui plano de fundo e $! não está definido se eu repetir na próxima linha após a chamada do imapsync ou a primeira linha do manipulador de sinal. :-(
Jason Tan

6
se bifurcar e embelezar a criança, é responsabilidade dos pais salvar o ID da criança em algum lugar. prática usual é salvá-lo em algum lugar como /var/run/whatever.pid. Talvez haja uma opção de linha de comando para solicitar que ele salve o PID em algum lugar; caso contrário, isso soa como um recurso para perguntar ao autor ou para se implementar.
Javier

1
Ênfase no plano de fundo . Se nenhum processo foi colocado em segundo plano (ou seja, com anexado &), a $!variável é indefinida.
Trevor

1
Soluções mais semelhantes são sugeridas em (uma resposta para) Como se familiarizar com o processo recém-iniciado ; como um complemento a esta resposta, um comentário não diz: oh, eo "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 de novembro '10 às 14:28
IMZ - Ivan Zakharyaschev

10

Ao contrário pidof, pgreppode ser dada uma variedade de opções para restringir para quais processos ele retorna PIDs. Um que pode ser particularmente útil é selecionar com base no PPID usando o PID do processo atual.

pgrep -P $$ imapsync

que produzirá apenas PIDs do imapsync se forem filhos do seu script.


0

Que tal colocar o imapsync em segundo plano momentaneamente, obter o PID e colocá-lo em primeiro plano ... Algo assim:

imapsync &
pid=$!
wait $pid
retVal=$?
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.