Como posso iniciar um processo em segundo plano e verificar quando termina em um script bash? Minha ideia é um script como este:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Resposta
A chave é o comando “wait”:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Comentários
Resposta
Com wait
você pode ter a granularidade de que precisa:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
Resposta
Esta é uma maneira de fazer isso:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
Comentários
- Obrigado, esta é definitivamente a única resposta que responde à minha interpretação da questão original (e a razão pela qual acabei olhando para esta questão)
- @cuonglm, O que há de múltiplos processos? Provavelmente
wait
é mais adequado para isso? - @cuonglm o que a opção -0 para matar o comando faz
- @k_vishwanath informa se o processo ainda está em execução ou não.
Resposta
Você pode executar seu processo com nohup e escrever um script de shell para ler arquivo nohup.out que o nohup usa para registrar.
nohup command &
Comentários
- (1) No risco de rachar os cabelos,
nohup
não ' não grava nada emnohup.out
; ele simplesmente cria o arquivo e redireciona a saída do comando para ele. (2) Se o comando não ' produzir qualquer saída, nada será gravado emnohup.out
, e essa ideia não vai a lugar nenhum. (3) Mesmo quecommand
escreva a saída, como você pode saber quando termina monitorando essa saída? - @ G- Cara, talvez verificando a saída de
lsof
para ver senohup
ainda está usandonohup.out
, mas concordo que é um método muito complicado. - (4) Quando
command
começa a ser executado,nohup
sumiu. (1) Sim, estou repetindo um número, porque estou repetindo o que disse há dois anos:nohup
não escreve nada paranohup.out
. (5) Sim, você pode escrever um script de shell para fazer um loop e executarlsof
para ver senohup.out
ainda está aberto. Mas essa seria uma resposta diferente. (6) Mesmo se você fizesse isso, não seria confiável. E se outro processo abrisse o arquivonohup.out
? Você realmente gostaria de verificar se este processo específico estavanohup.out
aberto. (7) Mas, se você vai fazer isso, por que não apenas verificar se o processo está em execução?
Resposta
wait
funciona apenas para um processo filho iniciado no mesmo shell; afinal, é uma função shell.
Para qualquer processo arbitrário em segundo plano, você precisa trabalhar com o PID. O que ninguém menciona aqui é a reciclagem do PID do kernel. Os sistemas Linux modernos podem reutilizar o PID bastante frequentemente, dependendo da carga. Você precisa de mais do que apenas PID para identificar o processo de forma confiável. Uma abordagem simples é economizar tempo quando o processo foi iniciado e compare-o regularmente com a hora de início do processo atual. Se o PID for reciclado, sua hora de início não será a mesma.
A hora de início do processo é relatada como campo 22 em / proc / [pid] / stat . O tempo é medido em jiffies (no máximo 10ms) que fornece o suficiente precisão para detectar a reciclagem do ID do processo.
PID=<process ID> START_TIME=$(cut -d " " -f 22 /proc/$PID/stat) while [ "$(cut -d " " -f 22 /proc/$PID/stat 2>/dev/null)" = "$START_TIME" ]; do echo "PROCESS IS RUNNING" sleep 1 done
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;