1

Я использовал Gmvault для резервного копирования своих учетных записей электронной почты Gmail, но поскольку на машине, которую я использую для этой работы, есть только 1 ГБ памяти, она часто убивалась системой (Ubuntu), когда она исчерпала всю доступную память. Но если я перезапущу его, он просто возобновится с того места, где его убили.

Поэтому я хотел бы иметь команду, которая заставляет его перезапустить после того, как он был убит. Я пробовал этот способ, но это не сработало:

for i in {1...999}; do gmvault sync peter123@gmail.com -d ./peter123 --resume; done;

Когда система уничтожала ее, она уничтожала всю команду (весь цикл), а не текущую итерацию в цикле.

1 ответ1

1

OOM Killer отправляет SIGKILL, так что нет способа изящно справиться с убийством. Но вы можете просто осиротеть процесс, чтобы избежать прерывания окружающего цикла:

while true
do
    nohup gmvault sync peter123@gmail.com -d ./peter123 --resume &
    pid=$!
    wait $pid || continue
    break
done

Протестируйте с помощью скрипта, который не исчерпывает память при третьем запуске:

$ 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

Выход:

$ 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .