systemdサービスから呼び出すと、bashスクリプトの「route add / del」が機能しません。

systemdサービスから呼び出すと、bashスクリプトの「route add / del」が機能しません。

ルーティングコマンドを使用してネットワークパスを追加または削除するスクリプトがあります。端末で通常のスクリプトとして実行すると正常に動作します。

しかし、システム化されたワンタイムサービスを使用して起動時に実行されるように自動化しようとしました。

サービスを作り、すべてがうまくいっているようです。どこにも不満がなく、どこでも観察できるエラーコードやメッセージはありませんが、パスは追加または削除されません。

"route add / del"を実行すると、systemdが何らかの制限を課しているようですが、それが何であるかわかりません。

CentOS 7を使用しているため、ExecStart、ExecStopに「+」を追加できません。

KillMode = None(スクリプト内でブランチを許可することはお勧めできません)を設定してみましたが、役に立ちませんでした。

パスのみを追加/削除するスクリプトバージョンを作成しました。テスト目的でスクリプトをほぼ1行に減らしました。 「route add」/「route del」を実行して問題を解決しました。問題は100%と言えます。スクリプトの他のエントリの代わりに "route add / del"を実行すると、systemdが実行されます。

どのように進むべきかわかりません。誰かが洞察力やデバッグ方法を提供できれば良いでしょう。

私のサービス定義は次のとおりです。特別なことはありません。

[Unit]
Description=Add/remove network X
After=network-online.target

[Service]
Type=oneshot
KillMode=none
ExecStart=/usr/local/bin/script.sh --start
ExecStop=/usr/local/bin/script.sh --stop

[Install]
WantedBy=multi-user.target

注:「systemd-networkd」がネットワークパスを作成できることはわかっていますが、スクリプトはネットワークパスを追加または削除するだけで機能するので、これは私が望むものではありません。

ベストアンサー1

さて、問題を発見しました。サービスタイプがワンタイムの場合は追加する必要があります。それ以外の場合は、実行RemainAfterExit=yes時に発生するように見えるものが実行systemctl start <service>されます。スクリプトはうまく機能し、パスの追加を使用してから。ExecStartExecStopExecStartExecStop

RemainAfterExit=yesサービスのユースケースはシステムの状態を変更することであるため、マイユースケースに使用するのが合理的です。systemdのドキュメントに記載されているように

ただし、when以降に実行されるこの動作がバグかCentOS7の期待される動作かはわかりませんExecStop。 Systemdのドキュメントに詳細な説明が見つかりませんでした(または見逃した可能性があります)。ExecStartRemainAfterExit=no

おすすめ記事