次のサービスがあります。
/etc/systemd/system/Detectwifi.service
[Unit]
Description=wifi detect automation
Requires=wpa_supplicant.service
After=wpa_supplicant.service
[Service]
Type=simple
ExecStart=/sbin/wpa_cli -a /home/pi/test.sh -B
Restart=always
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
その後、サービスを開始すると、コマンドがwpa_cli -a /home/pi/test.sh -B
実行されていることがわかります。その後、プロセスを終了すると再起動されません。
再起動しても機能しない理由がわかりますか?
また、その行にコメントを付けるとRemainAfterExit=yes
サービスは再起動されますが、プロセスが正常に実行されても再起動が継続されます。
ベストアンサー1
-B
プログラムに記載されていない準備プロトコルを維持して切り替えるという提案は、レビューの回答に対して常に非常に懐疑的でなければならない理由の別の例です。
RemainAfterExit=yes
ここのように嘘のときは使用しないでください。あなたのデーモンいいえプロセスが終了すると、実行中と見なされます。- 使用しないでください
-B
。とにかくデーモンのアイデアはエラーであり、プロセスはすでに始めました。デーモンのコンテキストで。
wpa_supplicant
あなたが直面する1つの問題は、問題のサービスが制御ソケットをバインドするまでサービスが実行されてはならないことをsystemdが知らないことです/run/wpa_supplicant/
。これにはタイミングの問題があり、サービスが「受け入れられるまで再起動し続けます」。 「それ。
wpa_supplicant
制御ソケットを開いたファイル記述子に渡す方法はまだ提供されていません。これにより、システムソケットデバイスを使用して定義でき、wpa_cli
その後にサービスデバイスと一緒に注文できます。
追加読書
- ジョナサン・ドボイン・ポラード(2001)。 Unixデーモンを設計する際に避けるべき間違い。よく与えられる答えです。
- ジョナサンデボインポラード(2015)。実際にデーモンは必要ありません。本当。。体系化された恐怖の家。
- ジョナサンデボインポラード(2015)。Unixデーモンの準備プロトコルの問題。よく与えられる答えです。
- チラグ・ナタジ(2019)。 systemdを使用したシンプルなワイヤレスネットワーキング。 chiraag.nataraj.us.
- https://unix.stackexchange.com/a/401611/5132