Inicie um processo em segundo plano e verifique quando ele termina


40

Como iniciar um processo em segundo plano e verificar quando ele 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"

Respostas:


66

A chave é o comando "wait":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"

7
Benefício desta: ele não queimar tempo de CPU com um loop infinito rodando o tempo todo ....;)
Pascal Schmiel

2
A desvantagem disso é que você não pode fazer mais nada enquanto espera, como indicar o progresso do usuário. Somente a solução da cuonglm permite que você faça isso.
Mark Booth #

3
@ Mark Booth Você pode indicar o progresso de um terceiro trabalho assíncrono. por exemplo:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell

32

Com waitvocê pode ter a granularidade necessária:

sleep 1 &
PID1=$!
sleep 2 &
PID2=$!

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'

29

Aqui está 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

2
Obrigado, este é definitivamente a única resposta que responde a minha interpretação da pergunta original (ea razão pela qual eu acabei olhando para esta pergunta)
Mark Booth

@cuonglm, o que há vários processos? Provavelmente waité mais adequado para isso?
Nishant

@cuonglm o que faz -0 opção para matar o comando do
k_vishwanath

11
@k_vishwanath informa se o processo ainda está em execução ou não.
cuonglm

0

Você pode executar seu processo com nohup e escrever um script de shell para ler o arquivo nohup.out que o nohup usa para registrar.

  nohup command &

4
(1) Correndo o risco de partir os cabelos, nohupnão escreve nada nohup.out; apenas cria o arquivo e redireciona a saída do comando para ele. (2) Se o comando não produzir nenhuma saída, nada será gravado nohup.out, e essa ideia não vai a lugar nenhum rapidamente. (3) Mesmo commandque a saída de gravação seja escrita, como você pode saber quando termina monitorando essa saída?
G-Man diz 'Reinstate Monica'

@ G-Man talvez verificando a saída de lsofpara ver se nohupainda está usando nohup.out, mas eu concordo que este é um método muito cabeludo.
Alexej Magura

(4) Quando o tempo commandcomeça a correr, nohupjá se foi. (1) Sim, estou repetindo um número, porque estou repetindo o que disse há dois anos: nohupnão escreve nada para nohup.out. (5) Sim, você pode escrever um shell script para executar um loop e executar lsofpara ver se nohup.outainda está aberto. Mas isso seria uma resposta diferente. (6) Mesmo se você fizesse isso, não seria confiável. E se algum outro processo abrisse o nohup.outarquivo? Você realmente deseja verificar se esse processo específico foi nohup.outaberto. (7) Mas, se você fizer isso, por que não apenas verificar se o processo está em execução?
G-Man diz 'Reinstate Monica'
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.