我想玩玩克里乌,一个用于检查点/恢复 Linux 进程的项目。为此,我正在使用 criu 的 hello-world,它是检查点并恢复简单循环。
我执行了以下步骤:
创建一个简单的循环程序:
$ cat > test.sh <<-EOF
#!/bin/sh
while :; do
sleep 1
date
done
EOF
$ chmod +x test.sh
运行:
$ ./test.sh
$ ps -C test.sh
PID TTY TIME CMD
2621 pts/1 00:00:00 test.sh
转储它:
# sudo criu dump -vvvv -o dump.log -t 2621 --shell-job && echo OK
OK
恢复它:
# sudo criu restore -vvvv -o restore.log --shell-job
恢复不起作用。它应该从中断的地方恢复循环过程。该过程应该继续在控制台中打印,但没有任何反应。也没有错误消息。
我的系统:
乌班图19.04
克里乌3.8.1
答案1
你应该阅读文档更接近:
运行(隔离)
现在,如果您尝试简单地运行并尝试转储这样的程序,criu 将失败。原因是从 shell 启动的程序与 shell 共享一些公共资源,特别是其会话和终端。 Criu 具有内置检查功能,可确保不存在此类资源。
要删除对当前终端的依赖,让我们在新会话中执行脚本并将其输出重定向到文件:
$setsid./test.sh</dev/null&>test.log&[2]2220[2]+完成
setsid./test.sh</dev/null&>test.log
答案2
这一系列命令在我的系统上有效。
sudo criu dump --images-dir ~/checkpoint --tree 2459 --shell-job
sudo criu restore -D ~/checkpoint --shell-job