busyboxシェルプロセスとサブプロセスを正しく停止する方法は?

busyboxシェルプロセスとサブプロセスを正しく停止する方法は?

実際のサーバープロセスはシェルスクリプトによって生成されます。

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

killallBusyboxは、フラグ-lとide、ong、およびshowスレッドのみを含む-q非常に限られています。pswlT

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 このソリューションパスの問題は、-9SIGKILL(信号番号)をキャプチャできないことです。

名前変更解決策の実行

KILL信号をキャッチできないので、次のパスに進みますexec


exec env - PATH=$PATH svscan /opt/service 2>&1

これにより、名前の変更により、Entware initシステムで「svscanboot」を停止/終了/再構成することに関連する問題がまだ複雑になります。 Execプロセス名を変更するには回避策が必要です。

svscanboot 模倣

svscanbootentware-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開始を防止します。

おすすめ記事