我一直在使用Gmvault备份我的 Gmail 电子邮件帐户,但由于我用于执行此工作的机器只有 1GB 内存,因此当它耗尽所有可用内存时,它经常被系统 (Ubuntu) 终止。但如果我重新启动它,它就会从终止点恢复。
所以我想要一个命令让它在被杀死后重新启动。我试过这种方法,但没有用:
for i in {1...999}; do gmvault sync [email protected] -d ./peter123 --resume; done;
当系统终止它时,它会终止整个命令(整个循环)而不是循环中的当前迭代。
答案1
这OOM 杀手 发送 SIGKILL, 所以没有办法优雅地处理杀戮. 但你可以简单地使进程孤立以避免周围的循环被终止:
while true
do
nohup gmvault sync [email protected] -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
已证明。