プロセスに影響を与えずに systemd サービスの名前を変更する方法 (停止/再起動なし)

プロセスに影響を与えずに systemd サービスの名前を変更する方法 (停止/再起動なし)

運用環境で systemd サービスの名前を変更する必要がある理由は複数あります。例:

  • 新しいものとより区別するため
  • 上司の命令だから
  • レガシースクリプトのため
  • ...

/etc/systemd/system/foo.service次のように新しい汎用サービスが作成され、有効化され、開始されたと仮定します。[1]

systemctl daemon-reload
systemctl enable --now foo

次に、関連するプロセスに何ら影響を与えずに、名前をfoo.serviceからに変更することができます。bar.service

通常の状況では、次のようにすればよいだけです。

mv foo.service bar.service
systemctl daemon-reload
systemctl disable foo
systemctl enable  bar

すると次のようになります:

  • systemctl status foo:running not-found disabled
  • systemctl status bar:not-running enabled

したがって、次のように修正するとよいかもしれません:

systemctl stop  foo
systemctl start bar

または、再起動します。ただし、実稼働環境では、このような変更のためにアプリケーションを停止したくないため、これは実現可能ではありません。さらに、再起動は数か月または数年後にスケジュールされます。同時に、bar見つからない実行中のサービスを停止する前に、誤って開始されないように、停止したサービスを長期間維持することは危険ですfoo

簡単に言うと、本番環境で systemd サービスの名前を変更するにはどのようなアプローチを使用しますか?

理想的な条件は、2 つのサービスに下位互換性があることです。つまり、停止するfooと停止も行われbar、その逆も同様です。


答え1

私が知らないもっと良い方法があるかもしれませんが、サービスを再起動するまで、必要なものをほぼすべて取得できる回避策として、これが思い浮かびます。

  1. 既存のサービスファイル(および)を指す、希望する新しい名前のシンボリックリンクを作成しますsystemctl daemon-reload。Systemd
    ユニットへのシンボリックリンクをエイリアスとして扱う別々のユニットではなく、両方の名前が同じユニット(同じステータス、同じすべて)を参照することを意味します。
  2. 次のメンテナンス期間中に実際にサービスを置き換えることを計画します。

関連情報