スクリプトからデーモンのようにプロセスを実行して構成したいと思います。
私のシェルはCygwinでエミュレートされたzshで、デーモンは基本的なFTPサーバーである [〜#〜] sfk [〜#〜] です。
ここで重要なのは、スクリプト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
信号を送信する必要があります。 dを避けるために避けたい CTRL+C。
代替は、スクリプト全体をバックグラウンドで実行することになります。 「する」でしょうが、スクリプトをstartserv.sh &
として実行すると、read
コマンドはユーザー入力を取得できません。
本当のdaemonではなく、短命なサーバーが必要であることに注意してください。つまり、スクリプトが終了した後、サーバープロセスをバックグラウンドで実行します。 (仮想マシンゲストを使用して)単純な対話型シェルタスクを実行しますが、シェルを生き残るためのプロセスは必要ありません。したがって、Nohup
は適切ではないようです。
ヒッティング Enter スクリプトはプロセスを終了し、バックグラウンドのままです。
ほとんど!実際、このスクリプトは、押すまでにすでに終了しています。 Enter。ただし、これはプロンプトを元に戻す方法です(シェルが$PS1
を繰り返し出力するため)。
打つ理由 Ctrl + C それらの両方が終了するのは、それらの2つがリンクされているためです。スクリプトを実行すると、シェルはそれを実行するサブシェルを開始します。このサブシェルを終了すると、おそらく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
を試すこともできます。詳細については、bash
インスタンスにhelp disown
と入力してください。
disown -h $cmd &
今、あなたのプロセスを殺すことになると、あなたは完全に行うことができます "Ctrl + C"kill
を使用します。残忍なSIGKILL
を送信しないでください。代わりに、以下を使用できます。
$ kill -2 [PID]
$ kill -15 [PID]
これにより、Nice SIGINT
(2)またはSIGTERM
(15)がプロセスに送信されます。プロセスの開始後にPID値を印刷することもできます。
...
Nohup $cmd &
echo $!
...またはそれ以上に、スクリプトが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
SIGINT
では不十分な場合は、代わりにSIGTERM
を使用してください(15):
trap "kill -15 $bg_pid" 2 15
これにより、スクリプトがSIGINT
(Ctrl + C、kill -2
)またはSIGTERM
バックグラウンドプロセスをwait
ingしている間、信号を中継するだけです。これらのシグナルがsfk
インスタンスを強制終了する場合、wait
呼び出しが返されるため、スクリプトも終了します:)