スクリプトでバックグラウンドプロセスを開始し、スクリプトが終了したら管理します。

スクリプトでバックグラウンドプロセスを開始し、スクリプトが終了したら管理します。

スクリプトのデーモンに似たプロセスを実行して構成したいと思います。
私のシェルはCygwinでzshをシミュレートし、デーモンはSFK、プライマリFTPサーバーです。

ここで重要なことのために、スクリプトドラフトをstartserv.sh次のように書くことができます。

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &

スクリプトを実行した後、プロンプトが表示されずに停止startserv.sh(終了?)されたら、次の操作を行います。

  • CTRL+Cスクリプトとバックグラウンドワークプロセスの終了。

  • プロセスを終了するためにスクリプトをクリックすると、Enterバックグラウンドに残ります。

とにかく通過することができ、見えpsないので、jobsプロセスを終了するには残酷な信号を送る必要があります。これは+を好むkill -9ので避けたいことです。CTRLC

デリゲート 〜するバックグラウンドでフルスクリプトを実行します。 「will」ですが、readスクリプトが次のように実行されると、コマンドはユーザー入力を取得できませんstartserv.sh &

実際のサーバーではなくステージングサーバーが必要であることに注意してください。悪魔:つまり、サーバープロセスがバックグラウンドで実行され、スクリプトが終了した後に単純なインタラクティブシェル操作(仮想マシンゲストを使用)を実行したいが、シェルで生き残るためにプロセスが必要ないため、不適切にnohup見えます。 。

ベストアンサー1

プロセスを終了するためにスクリプトをクリックすると、Enterバックグラウンドに残ります。

ほぼ!実際にを押すと、スクリプトはすでに終了していますEnter。ただし、これがプロンプトを復元する方法です(シェルが$PS1プロンプトを再印刷するため)。

Ctrl+をクリックすると、C両方が終了する理由は互いに接続されているためです。スクリプトを実行すると、シェルはそれを実行するためにサブシェルを起動します。このサブシェルを終了すると、バックグラウンドプロセスがシグナルによって終了する可能性がありますSIGHUP

独立したスクリプト、バックグラウンドプロセス、およびサブシェル

を使用すると、nohupこれらのマイナーな不快感をなくすことができます。

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

その他のdisownオプション

/bin/shからに切り替えることができる場合は、試してみることをお勧めし/bin/bashますdisown。詳しくは、インスタンスを入力しhelp disownてくださいbash

disown -h $cmd &

バックグラウンドプロセスを「適切に」終了します。

これで、プロセスを終了するときに「Ctrl+ C」を使用して完全に実行できますkill。残酷なメッセージを送信しないでくださいSIGKILL。代わりに、次のものを使用できます。

$ kill -2 [PID]
$ kill -15 [PID]

これにより、nice SIGINT(2) または (15) がプロセスに送信されます。SIGTERMプロセスの開始後にPID値を印刷することもできます。

...
nohup $cmd &
echo $!

...またはより良い方法は、スクリプトがaを待ってSIGINTからバックグラウンドプロセスに戻すようにすることです。(これを行うと、スクリプトは前景に保持されます):

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

# Storing the background process' PID.
bg_pid=$!

# Trapping SIGINTs so we can send them back to $bg_pid.
trap "kill -2 $bg_pid" 2

# In the meantime, wait for $bg_pid to end.
wait $bg_pid

aがSIGINT足りない場合は、SIGTERM(15)の代わりにaを使用してください。

trap "kill -15 $bg_pid" 2 15

これにより、スクリプトはSIGINTCtrl+ Ckill -2)を受け取るか、バックグラウンドプロセスでingSIGTERM中にwait信号のみを渡します。これらのシグナルがsfkインスタンスを終了すると、wait呼び出しが返されるため、スクリプトも終了します。 :)

おすすめ記事