Subshel​​lをバックグラウンドで実行し続ける

Subshel​​lをバックグラウンドで実行し続ける

バックグラウンドでスクリプトを実行するためにコマンドの最後に「&」を使用しようとしましたが、うまくいかないようです。

これが私が直面した問題です。有料シミュレーションソフトウェアを使用するために、プロバイダは、ライセンスアクセスを有効にする特定のスクリプトを実行するように指示しました。私はこれを開いて他の端末でソフトウェアを起動します(スーパーコンピューティングクラスタを使用しているため、GUIなしでバッチモードで)。

問題は、ヘッドノード(sshを介して接続)のスケジューラにのみスクリプトを送信でき、タスクがコンピューティングノードの1つに渡されることです。そのため、ソフトウェアを実行するために新しい端末を起動するのではなく、「&」を使用して提供されたスクリプトをバックグラウンドで実行してみました。これはうまくいきませんでした。この方法では、ライセンスサーバーへの接続が終了するようです。

./script1.sh &

使用

xterm -e sh script1.sh 

別の端末で開くと、次のエラーが発生します。

xterm: Xt error: Can't open display: 

xterm: DISPLAY is not set

どんな助けでも大変感謝します。

答え1

あなたが提出した仕事は、これら2つのことをすべて実行することであるべきです。

#!/bin/sh
license </dev/null >license.out 2>&1 &
license_pid=$!
simulator
kill $license_pid
wait $license_pid

これにより、ライセンスプロセスの標準出力と標準エラーがファイルに保存されるため、tail問題がある場合に通知する内容を確認できます。

答え2

sshまずノードに移動してからコピーを開始できますかscreen?マニュアルページを確認してください。これにより、sshログインシェルの(効果的に)サブプロセスとして複数のセッションを持つことができます。

いつものようsshに。開始screen。 2番目の画面を作成するには、Ctrl-と入力します。この画面でライセンスを開始し、-を使用して元の画面に戻ります。そこでアプリケーションを起動してください。必要に応じて - を使用して順番に前後に切り替えることができます。AcCtrlA CtrlACtrlA CtrlA

終了せずに分離するにはCtrl- ACtrl;d後で再接続します(sshセッションを終了して再ログインした後も機能しますscreen -x)。

答え3

(私はこの質問を約3年前に投稿しました。シェルスクリプトに精通していると言いたいです。

したがって、以前のコメントで提案したとおりに使用する必要がありますscreen。ただし、クラスタでコードを実行するとキーボードショートカットにアクセスできないため、Ctrl + Aを使用してメインボディに戻ることはできません。答えが示すように、スクリプト。

まあ、私がしなければならないscreenことは、次のようにバックグラウンドで始めることです。

メインスクリプトとは別のモードで「sample-screen」という画面を起動します。

screen -S sample-screen -d -m

別の画面に再接続せずにコマンドを実行するように依頼してください。

screen -S sample-screen -p 0 -X stuff "./script1.sh & ^M"

^M戻り文字です。分割画面でEnterを押すのと似ています。

スクリプト終了時に画面を終了するには -

screen -XS sample-screen quit

関連情報