1

ユーザー入力を要求するシェル スクリプトがあり、入力に応じて sqlplus を使用してデータベース接続を開き、drop table /create table/select/update などの SQL クエリを実行します。ネットワークへのvpn接続が失われた場合でも、すべてのsqlクエリが実行されるように、sql部分をバックグラウンドジョブとして実行することは可能ですか? また、SQL部分が完了し、ユーザーが別の入力を求められると、シェルスクリプトがフォアグラウンドになり、入力を再度取得した後、バックグラウンドになりますか?

スクリプトをバックグラウンドで実行する方法を教えてくれるいくつかの質問を見つけましたが、可能であれば同じスクリプトの一部のみをバックグラウンドで実行したい (そしてユーザー入力のためにフォアグラウンドに来ます)。ただし、複数のスクリプトを処理することもできます。それ(バックグラウンドで呼び出す必要がある部分にスクリプトを分割し、別のスクリプトを介してそれらを呼び出す)、可能であれば単一のスクリプトで実行したいと思います。

4

2 に答える 2

1

メインスクリプトを関数/小さなスクリプトに分割して、バックグラウンドプロセスとフォアグラウンドプロセスを組み合わせた目的の動作を実現できます。

たとえば、メインスクリプトでは次のようになります。

#!/bin/sh

echo "Starting script..."

# do so more stuff here, maybe ask user for input

./run_background_process_1 &

# ask the user for some more input

./run_background_process_2 &
...

&スクリプト呼び出しの最後にある記号を使用して、スクリプト呼び出しをバックグラウンドで実行する必要があることを示します。

更新)すべてを1つのスクリプトに保持する場合は、関数を使用して、バックグラウンドで実行するロジックの部分を分割/カプセル化します。&上記と同じように、呼び出しの末尾に。を付けて、これらの関数を呼び出します。

次の例を試して、機能することを確認できます。

#!/bin/sh

hello() {
    condition="yes"
    while [[ $condition== "yes" ]]
    do
        echo "."
        sleep 1
    done
}

# Script main starts here
echo "Start"
hello &
echo "Finish"

&後を削除するhelloと、動作が異なることがわかります。

接続が失われた場合でもスクリプトを実行し続けることができるツールがあります。たとえば、http://www.gnu.org/software/screen/をチェックしてください-その機能の1つはPrograms continue to run when their window is currently not visible and even when the whole screen session is detached from the users terminal.

于 2012-10-26T05:58:53.487 に答える
0

インターネットで検索した後、3つの方法を使用してスクリプトの背景を作成できることがわかりました。

1) bg の使用:既に実行中のプロセスを nohup の下に置くにはどうすればよいですか? .しかし、残念ながら、これは ksh シェルでは機能しませんでした。2) コプロセスを使用する 3) nohup を使用する 実装が簡単だったので、nohup を使用することにしました。バックグラウンドで実行する必要がある sqlplus の部分は、別のスクリプトを作成し、nohup を使用してメイン スクリプトから呼び出しました。

nohup script-name.ksh ${parameter1} ${paramter2} & 

これは私にとってはうまくいきました。

于 2012-11-13T00:48:29.833 に答える