
サービスの開始/停止/再起動の方法で呼び出されるように、bash スクリプトからサービスを設計するタスクがあります。
サービスになるスクリプトは、1 分ごとに起動してチェックを行う無限 while ループです。私はこれを次のように呼び出します。
start() {
echo -n $"Starting $DESC:"
DAEMON_ARGS=$(xmlstarlet sel -T -t -m "/config/input/sensor/device/resource" -v "concat(../../@type, ' ', ../../@dev, ' ', @res)" -n $CONFIGURATION_FILE | extract_devices) # get device names out of XML file
echo "daemon args $DAEMON_ARGS"
start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
echo}
pid と daemon は次のように定義されます:
PIDFILE="/var/run/detection.pid"
NAME="jblub_control_loop.sh"
DAEMON="/root/test_det/${NAME}"
走るとき
./detection start (init.d にコピーして、service detection start で実行することも試みました)
init スクリプトはループから抜け出せず、start-stop-daemon 関数内でブロックされたままになります。jblub_control_loop.sh 内の無限 while ループをコメント アウトすると、ループは通過しますが、pid ファイルは作成されません。
私の質問は、無限ループのあるスクリプトをサービスとして適切に起動する方法と、pid ファイルが作成されない理由です。
答え1
まず、
--background スイッチを使用してフォークします。-m スイッチを使用して PID ファイルを作成します。
start-stop-daemon --start --background -m --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
完全な答えについては、https://stackoverflow.com/questions/16139940/what-is-start-stop-daemon-in-linux-scripting
楽しむ