Reinicia um comando depois que ele é morto pelo sistema

1

Eu tenho usado o Gmvault para fazer backup de minhas contas de e-mail do Gmail, mas como a máquina que eu uso para fazer esse trabalho tem apenas 1 GB de memória, foi morto pelo sistema (Ubuntu) quando esgotou toda a memória disponível. Mas se eu reiniciei, seria apenas retomar do ponto em que foi morto.

Então, eu gostaria de ter um comando que o faça reiniciar depois de ser morto. Eu tentei desse jeito, mas não funcionou:

for i in {1...999}; do gmvault sync [email protected] -d ./peter123 --resume; done;

Quando o sistema o matou, ele matou o comando inteiro (loop inteiro) em vez da iteração atual no loop.

    
por bobo 01.08.2015 / 05:48

1 resposta

1

O Assassino da OOM envia o SIGKILL , então não há como lidar com a matança . Mas você pode simplesmente tornar o processo órfão para evitar que o loop circundante seja encerrado:

while true
do
    nohup gmvault sync [email protected] -d ./peter123 --resume &
    pid=$!
    wait $pid || continue
    break
done

Teste com um script que não fique sem memória na terceira execução:

$ cat test.sh 
if [ -e tries.txt ]
then
    tries=$(($(cat tries.txt) + 1))
else
    tries=0
fi
echo $tries > tries.txt

if [ $tries -lt 2 ]
then
    echo Failing $tries
    ulimit -v 50000
    :(){ : $@$@;};: :
fi
echo Succeeding

Saída:

$ while true
> do
>     nohup bash test.sh &
>     pid=$!
>     wait $pid || continue
>     break
> done
[1] 28972
nohup: ignoring input and appending output to ‘nohup.out’
[1]+  Exit 2                  nohup bash test.sh
[1] 28973
nohup: ignoring input and appending output to ‘nohup.out’
[1]+  Exit 2                  nohup bash test.sh
[1] 28975
nohup: ignoring input and appending output to ‘nohup.out’
[1]+  Done                    nohup bash test.sh
$ cat nohup.out 
Failing 0
test.sh: xmalloc: cannot allocate 8388609 bytes (29577216 bytes allocated)
Failing 1
test.sh: xmalloc: cannot allocate 8388609 bytes (29577216 bytes allocated)
Succeeding

QED.

    
por 01.08.2015 / 11:47