そこで、CRIU を使用して JVM プロセスのスナップショットを作成し、後で復元したいと考えています。この目的のために、毎秒カウンターを出力するだけの小さなプログラムを書きました。
package some;
public class Fun {
public static void main(String[] args) throws InterruptedException {
for(int i = 0; i < Integer.valueOf(args[0]); i++) {
System.out.println("Counter: "+i);
Thread.sleep(1000);
}
}
}
プログラムを実行すると、プログラム$ java some.Fun 3000
は秒を表示し始めます。
criu を使用してプロセスを保存する場合$ ps -aux
は、Java プロセスの PID (この場合は 3503) を見つけて、criu を呼び出します$ criu dump -t 3503 -o dump.log --shell-job
。その後、カウンターのある端末はカウントを停止し、印刷Killed
して終了するようです。
criu を呼び出したフォルダーのこの時点で、プロセスを復元するために使用できるいくつかのダンプ ファイルを取得しました。$ criu restore -o dump.log --shell-job
そうすると、新しい PID を持つ新しいプロセスが作成され、カウンターは停止した瞬間からカウントを開始します。良い!
ただし、プロセスを強制終了し、同じダンプ ファイルを使用してプロセスを復元しようとするとします。これを行うと、 criu はメッセージですぐに終了しますAborted (core dumped)
。同じJavaバージョンの別のマシンにファイルを転送して、そこで実行しようとすると、同じことが起こります...
今私の質問は:そうあるべきですか?一度だけ状態を復元できるはずですか?それとも私は何か間違ったことをしていますか?前もって感謝します!