「実行中のスクリプト」を一時停止し、OS にその状態をディスクに保存させ、後でその状態を読み取り、その状態から正確に続行することで再開できるようにする必要があります。このシステムは、Linux を実行する 48 GB の共有メモリを備えた 12 コアの計算ノードです。私には管理者権限がなく、ssh を使用してリモートでログインしています。スクリプトとその中の実行可能ファイルは GUI を使用せず、すべてコマンド ラインであり、私の知る限り、明示的にネットワークやソケットを必要としません。
「実行中のスクリプト」(または「パイプライン」) とは、bash スクリプト、perl スクリプト、またはいくつかの C/C++ 実行可能ファイルを生成する 2 つのスクリプトの組み合わせを意味し、おそらくそれらは openmp 並列化を使用しています。または、gnu-parallel を使用して並列実行可能ファイルを生成します。つまり、単一の実行可能ファイルについて話しているのではなく、複数の UNIX コマンド (awk など) によって接着された共通メモリを使用して 12 コアで暗黙的な並列化を使用して、並列または順次実行される一連の実行可能ファイルについて話しているのです。
スケジューラ (MOAB) は 24 時間以上実行されているすべてのジョブ (システム ルール) を強制終了するため、パイプラインを一時停止して再起動する必要があります。アイデアは、ジョブを一時停止して再キューイングすることです。この手法は完全に正当です。
実行可能ファイルのソース コードを変更してすべての状態を保存し、後でそれを再開することは、いくつかのオープンソース実行可能ファイルを変更して「状態を保存して一時停止」信号を受け入れるようにすることを意味するため、実用的ではありません。たとえば、ImageMagick の「変換」または「grep」、「sed」、「awk」、さらには perl も!さらに、ソース コードのないクローズド ソースの実行可能ファイルも 1 つあります。
したがって、1 つの (唯一の?) 実用的なオプションは、QEMU (エミュレーター) などのいわゆるサンドボックス環境で「スクリプト/パイプライン」を実行することであり、うまくいけばシグナルを送信できる状況にあると思います。 「休止状態」にするには、メモリ全体とCPUの状態をディスクに保存し(48GBは問題ありません)、一時停止するだけで、現在実行中のすべてのプログラムの状態を保存します。
私は上記のいずれについても専門家ではないので、用語が間違っていたり、不適切なことを言っている場合はご容赦ください。スケッチしているだけです。
要約すると、コードを「状態を保存」するように変更することなく、Linux で複雑なスクリプト ジョブを一時停止および再開するための解決策について、経験のある方にお尋ねします。このソリューションは、比較的計算効率が高い必要があります。つまり、エミュレーターを実行するために多くのスーパーコンピューターのパワーを無駄にすることはありません。
上記の QEMU ソリューションで問題ないと思われる場合は、可能であれば、それから始める方法の例をいくつか挙げてください。つまり、公開 ISO からエミュレータ Linux イメージを作成し、イメージをロードし、「スクリプト」を実行します。エミュレータに 20 時間後に「サスペンド/ハイバネート」するように指示し、サスペンド状態からエミュレータの状態を読み取ってエミュレータを再開します。これらはすべて、理想的にはコマンド ラインから、またはスクリプトを介して行います。
(指定された設定に対して) 実用的である限り、他の解決策は歓迎されます。
注意: 管理者権限はありませんが、ホームディレクトリにインストールでき、多くのハードディスク容量があります。また、プログラムは GUI を使用せず、すべてコマンド ラインであり、私の知る限り、ネットワークやソケットを明示的に必要としません。
エミュレーターを使用したソリューションのプラスの副作用として、そのような「パイプライン」は、「サンドボックス」/エミュレーターが実装されている任意の OS (Mac や Win など) に配布でき、すべてを再コンパイルする複雑なプロセスは必要ありません。そしてgnu-utils、bash、boostなどをインストールします。私は何度もこの状況に陥っています。
助けてくれてありがとう、ブリアコ。