Executando uma sequência de comandos um após o outro

6

Eu tenho uma situação em que executo dois comandos (eles entram em segundo plano (nohup)), volto depois de 2 horas, e se ambos tiverem concluído, execute mais dois comandos (novamente nohup), volte novamente após 2 horas e execute mais dois comandos e assim por diante.

Eu queria saber se era possível fazer fila para que, depois dos dois primeiros terminados, os próximos dois iniciassem automaticamente, para que eu não precisasse continuar checando a cada 2 horas?

Todos esses são programas independentes; Eles são simulações que são memória e CPU com fome, então eu não quero mais do que dois deles rodando simultaneamente a qualquer momento.

Eu os executo usando uma sintaxe semelhante a:

nohup mySimulator inputs1.txt
nohup mySimulator inputs2.txt
nohup mySimulator inputs3.txt [after the first two have completed, that is..]
    
por Pradyumna 02.10.2012 / 20:33

3 respostas

8

escreva um script de shell como este:

nohup mySimulator inputs1.txt
nohup mySimulator inputs2.txt
while (ps -A | grep -v grep | grep mySimulator > /dev/null); do sleep 1; done
nohup mySimulator inputs3.txt

Em seguida, execute-o a partir do shell

Ele dispara dois simuladores e aguarda até que não haja mySimulator na lista de processos e continue.

(Isto foi executado em um Mac, então, dependendo do seu sistema operacional, pode ser necessário um pouco de ajustes ... ps -A deve imprimir uma lista de todos os processos em execução)

    
por 02.10.2012 / 20:55
8

use o comando wait , mas não use nohup.

command1 &
command2 &
wait        # this waits for command1 and command2
command3 &
command4 &

de man bash :

wait [n ...] Wait for each specified process and return its termination status. Each n may be a process ID or a job specification; if a job spec is given, all processes in that job's pipeline are waited for. If n is not given, all currently active child processes are waited for, and the return status is zero. If n specifies a non-existent process or job, the return status is 127. Otherwise, the return status is the exit status of the last process or job waited for.

    
por 02.10.2012 / 21:10
2

Você pode usar o operador bash && . Isso é semelhante ao operador pipe | , exceto pelo fato de não canalizar a saída para o próximo comando. Em vez disso, ele os une para que a execução continue enquanto um dos comandos não encontrar um erro.

Por exemplo:

echo "Test" && echo "Test done." && echo "Test2" && echo "Test2 done."

Isso interromperá um erro de script ou qualquer script que retornar false . Por exemplo:

echo "Test" && echo "Test done." && echo "Test2" && echo "Test2 done." && false && echo "This will never trigger."
    
por 02.10.2012 / 20:59

Tags