ユーザー入力でスクリプトを実行し、ジョブを切断してバックグラウンドで実行します。

ユーザー入力でスクリプトを実行し、ジョブを切断してバックグラウンドで実行します。

だから最初に、ユーザーに一連の3つの変数を要求するbashスクリプトがあります。その後、ラップトップとスーパーコンピュータ間の接続を切断しても、スクリプトが継続的に実行されるようにセッションが切断されたバックグラウンドでスクリプトを実行したいと思います。

echoを使用するには変数が必要です。コードは次のとおりです。

echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input 

次に、長いコマンドのリストを実行します。

しかし、私のセッションでこのタスクの接続を正常に切断する方法がわかりません。ログアウト後の手順で生成されたファイルが生成されなかったため、最後の「disown」コマンドは機能しませんでした。

私が理解したところによると、nohupはここでは機能しません。これは、スクリプトが最初に提供するように要求する入力を読み取らないようにするためです。

では、設定する方法はありませんか?

答え1

nohupスクリプトの2番目の部分でタスクをシミュレートすることでこれを行うことができます。

このnohupコマンドは、次の操作のみを実行します。

  • スクリプトが端末から読み取ったり、端末に書き込もうとしないように、標準のファイル記述子をリダイレクトします。

  • SIGHUP信号をキャプチャして無視します。 SIGHUP は、制御端末が閉じたときにプロセスが受信する信号です。省略すると、端末が閉じた後も処理が実行され続けます。

これを行うには、次のスクリプトを使用できます。

echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input 
(
    trap '' 1  # Ignore SIGHUP
    # Series of long running commands
    # using $low, $high and $input
) </dev/null >myscript.log 2>&1 &

最後の行は/ dev / nullのstdinとstdoutとstderrをaにリダイレクトします。myscript.log(より良いファイル名を選択し、タイムスタンプまたは同様のファイル名を使用して一意にすることもできます。)

最後に、プロセス全体をバックグラウンドに置き、最終的な&

もう1つの可能性は、スクリプトを2つの部分に分割し、2番目の部分で、lowコマンドライン引数として、またはエクスポートされた環境変数として使用することですhighinput実際 nohup注文する。インタラクティブなプロンプトを処理せずに実行の2番目の部分をスクリプト化できるため、これはより簡単で柔軟性が必要です。

tmuxもう1つの可能性は、接続が切断されたときにセッションに再接続できるようにするか、同じ端末マルチプレクサを使用するかscreen(または直接分離できます)、スクリプトの実行中に新しいウィンドウを開くことです。新しいシェルの初期ウィンドウを起動します。上記のいずれかのソリューションを実装しているかどうかにかかわらず、またはを採用することtmuxをお勧めしますscreen。可能であれば試してみてください。

答え2

長いコマンドのリストを中かっこで囲んだ後、& を使用すると待つことなく続行できます。

echo "Read input"
{
    # all your commands in curly braces
    # ...
} & exit 0

これにより、すべてのコマンドが完了するのを待たずに終了できます。サーバーが切断されても、引き続き実行する必要があります。

関連情報