デフォルトの依存関係=いいえを持つサービスのため、シャットダウンが非常に遅くなります。

デフォルトの依存関係=いいえを持つサービスのため、シャットダウンが非常に遅くなります。

組み込みLinuxシステムがあり、私が作成した特定のサービスが実行されているときにシャットダウンするのに時間がかかります。できるだけ早く実行を開始する必要があるため、DefaultDependency = noオプションを設定してください。

私が走るとき

systemctl stop myService

期待どおりに機能し、サービスはすぐに停止します。

しかし、私が走るとき

shutdown now

サービスがまだ実行されていることがわかります(LEDが変わり続けます)。サービスが実行される実行可能ファイルには、SIGTERM および SIGINT のシグナルハンドラがあります。

実行可能ファイルを手動で実行してctrl + cを押してSIGINTを送信すると、正しく停止します。

残念ながら、Journalctlから良いログ情報を取得することはできません。

どうやってこのようなことが起こったのか知っている人はいますか?

シャットダウンするとsystemctlがトリガされ、すべてのサービスが停止しませんか?

正常に終了するには、別のものを指定する必要がありますか?

編集:リクエストに応じてサービスが利用可能

### My service###

[Unit]
Description=My service
DefaultDependencies=no

[Service]
CPUAffinity=3
ExecStart=/path/to/startscript.sh
Type=simple

[Install]
WantedBy=sysinit.target

起動スクリプトは手動更新後に実行権限が失われる可能性があるため、実行可能ファイルに実行権限があることを確認してください。その後、次のように実行

nice -n -20 /path/to/exe.elf

実行ファイルは非常に優先順位が高く、独自のCPUと高い親切さを持っています。

答え1

なぜ設定したのですDefaultDependencies=noか?これはいくつかの珍しいユースケースにのみ必要です。

systemd.service(5) マンページには以下が表示されます。

デフォルトの依存関係 DefaultDependency=no が設定されていない場合、次の依存関係が追加されます。

•サービスユニットは、sysinit.targetの場合はRequires =およびAfter =の型の依存関係、basic.targetの場合はAfter =の型の依存関係、shutdown.targetの場合はContributes =、およびBefore =の型の依存関係を持ちます。これにより、通常のサービスデバイスは基本システム初期化を実行し、シャットダウン前に完全にシャットダウンされます。早期起動または遅延システムシャットダウンに関連するサービスだけが、このオプションを無効にする必要があります。

[...]

本当に必要または設定したい場合は、ターゲットを含む依存関係を手動で明示的に設定するDefaultDependencies=no必要があります。After=/Before=/Conflicts=shutdown.target

Nice=編集:ところで、.serviceファイルにその属性があることをご存知でしたか? (systemd.exec(5)のマニュアルページを参照)、nice実行可能ファイルを呼び出さずに

関連情報