Inicie um processo em segundo plano e verifique quando termina

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

  • Benefício: NÃO queima a CPU tempo com um loop infinito em execução o tempo todo ….;)
  • A desvantagem disso é que você não pode ' fazer qualquer outra coisa enquanto espera , como indicar o progresso para o usuário. Apenas a solução cuonglm ' s permite que você faça isso.
  • @Mark Booth Você pode indica o progresso com um terceiro trabalho assíncrono. por exemplo: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

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 em nohup.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 em nohup.out, e essa ideia não vai a lugar nenhum. (3) Mesmo que command 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 se nohup ainda está usando nohup.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 para nohup.out. (5) Sim, você pode escrever um script de shell para fazer um loop e executar lsof para ver se nohup.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 arquivo nohup.out? Você realmente gostaria de verificar se este processo específico estava nohup.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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *