スクリプトのデーモンに似たプロセスを実行して構成したいと思います。
私のシェルは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
これにより、スクリプトはSIGINT
(Ctrl+ C、kill -2
)を受け取るか、バックグラウンドプロセスでingSIGTERM
中にwait
信号のみを渡します。これらのシグナルがsfk
インスタンスを終了すると、wait
呼び出しが返されるため、スクリプトも終了します。 :)