
実際のサーバープロセスはシェルスクリプトによって生成されます。
djb用の初期化スクリプトを作成しようとしています。デーモンツール以内にエントソフトウェアbusybox 1.24(ash shell)を実行しているルーターで。 daemontoolsが独自に起動する方法は次のとおりです。svscanbootシェルスクリプト。削除しましたので参考にしてくださいプロセスタイトルを読むsvscanbootから。
PATH=/opt/sbin:/opt/bin:/bin:/sbin:/usr/bin:/usr/sbin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
/opt/bin/svc -dx /opt/service/* /opt/service/*/log
env - PATH=$PATH svscan /opt/service 2>&1
親シェルスクリプトプロセスは、svscan
実際に実行されているサーバープロセスである(子)子プロセスを作成します。
シェルプロセスは TERM 信号を受信します。
svscanboot &
バックグラウンドで親プロセスを実行して終了すると、子プロセスが実行されます。
# ps l | grep svscan
S 0 1526 1 1560 404 0:0 22:57 00:00:00 {svscanboot} /bin/sh /opt/bin/svscanboot
S 0 1528 1526 976 252 0:0 22:57 00:00:00 svscan /opt/service
# killall svscanboot
しかし、svscanは引き続き実行されます。
# ps l | grep svscan
S 0 1528 1 976 252 0:0 22:57 00:00:00 svscan /opt/service
親プロセスを実行しsvscanboot
て(フォアグラウンドで)終了すると、子プロセスも引き続き実行されます。
# ps l | grep svscan
S 0 676 671 1560 400 pts1 23:41 00:00:00 {svscanboot} /bin/sh /opt/bin/svscanboot
S 0 678 676 976 252 pts1 23:41 00:00:00 svscan /opt/service
# killall svscanboot
# ps l | grep svscan
S 0 678 1 976 252 pts1 23:41 00:00:00 svscan /opt/service
killall
Busyboxは、フラグ-l
とide、ong、およびshowスレッドのみを含む-q
非常に限られています。ps
w
l
T
Ctrl+ を使用してフォアグラウンドバージョンを終了すると、C親プロセスと子プロセスの両方が終了します。
この場合、親プロセスと子プロセスを停止する方法は?を使用killall
して最終的に修正することをお勧めします。svscanboot
答え1
実装する
質問と回答を読んだ後「exec envコマンド」の意味1つの可能な解決策は前に追加することですenv …
。exec
これにより、子プロセスが生成されるのを防ぐことができます。しかし、ps
出力は{svscanboot} /bin/sh /opt/bin/svscanboot
。名前svscan /opt/service
はに変更されますexec
。
または信号をつかむ
この問題を処理する別の方法は、トラップを介して信号を子プロセスに伝播することです。良いBashのサブプロセスにSIGTERMを渡すまたは、より詳細な説明http://veithen.github.io/2014/11/16/sigterm-propagation.html
このソリューションパスの問題は、-9
SIGKILL(信号番号)をキャプチャできないことです。
名前変更解決策の実行
KILL信号をキャッチできないので、次のパスに進みますexec
。
…
exec env - PATH=$PATH svscan /opt/service 2>&1
これにより、名前の変更により、Entware initシステムで「svscanboot」を停止/終了/再構成することに関連する問題がまだ複雑になります。 Execプロセス名を変更するには回避策が必要です。
svscanboot 模倣
svscanboot
entware-daemontools-init-scriptは、次のように模倣することができます。
ENABLED=yes
#PRECMD="exec </dev/null;exec >/dev/null;exec 2>/dev/null;/opt/bin/svc -dx /opt/service/* /opt/service/*/log"
PROCS="svscan"
ARGS="/opt/service 2>&1"
PATH=/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
PREARGS="env - PATH=$PATH"
DESC="daemontools"
注釈付きの PRECMD は、ジョブのsvscan
開始を防止します。