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?

Jason Tan
fonte
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.

Gilles LAMIRAL
fonte
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 .

Javier
fonte
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.

Pausado até novo aviso.
fonte
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=$?
Marca
fonte