職場には SSH 経由でアクセスできるスーパーコンピューターがあります。
ログインし、パラメータ付きのコマンドを使用してコアを予約しbsub
、後者は(ドキュメントから)「疑似端末を使用した対話型 bash セッション」を作成します。
次に、その「疑似ターミナル」でフォルダーに移動し、パラメータを指定してソルバーを起動し、完了するまで実行します。
つまり、アプリが完了してセッションが開いたままになり、予約されたコアは予約されたままになり、数日後 (シミュレーションが金曜日の勤務後に終了した場合)、IT 部門は月曜日に、コアは予約されているがアクティビティがないことを示すメールを送信します、などなど...
確認しましたhttps://stackoverflow.com/questions/14254118/スクリプトを終了する前にバックグラウンドプロセスが終了するのを待機していますそしてBash - 前のコマンドが終了した後にコマンドを実行するにはどうすればいいですか?および他のフォーラム/チュートリアルも調べましたが、ターミナルを閉じた後もアプリケーションを実行し続ける方法 (ターミナルからアプリケーションを切り離す) しか見つかりません。
私はその逆が必要です。ターミナルを閉じたいのです(これはソルバーの最後のステップになる可能性があるので、ターミナルを終了して強制終了することができます)
提案があれば歓迎します。スクリプトで実行することもできますし、C++ ソルバーでコードを書いてもらうこともできます。
私は次のことを試しました (VM で実行されている Ubuntu Server で、どの環境でもほぼ同じように動作するはずですbash
。間違っている場合は訂正してください)。
遅延テスト.c:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf("Doing some fake lengthy operation...");
sleep(15); // sleep for 15 seconds
return 0;
}
system("clear");
期待どおりにコンパイルおよび実行されます。戻る前に(の一部)を試してみましたstdlib.h
が、これも機能し、メッセージが表示され、15 秒後に画面がクリアされ、アプリが終了します。
その後、試してみましたsystem("exit");
が、何も起こりませんでした (つまり、そのステートメントがなかったかのようにアプリが終了しますexit
...)。私の推測では、ターミナルを終了する前にアプリが戻る必要があると思われますが、それは単なる推測にすぎません。
スクリプトによる方法も試しました:
テスト:
#!/bin/bash
./delay_test &
wait
exit
この場合、私の理解では、このexit
ステートメントはスクリプトを終了するためのものですが、問題のアプリが終了したらターミナル セッションを終了する必要があるようです。
では、アプリの終了後に「疑似端末」を強制的に終了させるにはどうすればいいでしょうか?
答え1
コマンドによって提供されるシェルで最も簡単な方法bsub
は、実行するコマンドの前に を付けることですexec
。これは、提供されたシェルをソルバーに置き換える組み込みシェルです。
exec yoursolver
が終了すると、シェルはずっと前にソルバーに置き換えられているため、yoursolver
は に戻ります。bsub
(余談ですが、一部の言語(TCL、PHP)にexec
は 全然似ていないシェルや Perl exec
、C 関数とは異なります。そのため、これらの言語を使用している場合や、これらの言語に精通している場合は、この違いに注意してください。TCL および PHP バージョンは、Cまたは Perl関数、またはシェルにコマンドを入力するexec(3)
ことに似ており、元のプロセスがその後も残ります。system(3)
system