web-dev-qa-db-ja.com

rc.localを再作成する代わりにsystemdでrc.localの正しい代替品は何ですか

Systemdでいくつかのlocalスクリプト(または非常にローカルなコマンド)を実行する正しい方法が見つかりません。この種類のスクリプト(またはIする必要がありますか?)...

私が見つけた回避策は、rc.localを作成し、それに実行権限を与えることです。

printf '#!/bin/bash \n\nexit 0' >/etc/rc.local 
chmod +x /etc/rc.local

たとえば、単純なrc.localが構成されたレガシーサーバーを入手した場合、rc.localは外部から尊重されていたので、あなたが何をし、ディストリビューションに新しいものをアップグレードまたはインストールするのにどれほどの害を及ぼすかがわかりますパッケージですが、一方でサーバーをインストールしてsystemdユニットを1つまたは2つまたは3つ(またはsysvinitサービス)作成した場合、単純なタスクを実行するだけで、これがあなたの人生をさらに困難にする可能性があります。名前は、ディストリビューションの開発によって作成された新しいサービスの名前といつか競合する可能性があり、アップグレードにインストールされ、スクリプトに問題を引き起こす可能性があります。

別の質問について尋ねるどこにrc.localが表示され、答えはそれを作成して実行権限を与えることでした、私の質問は本当にnotだと思います= a duplicate、それがどこにあるのか知りたくないので-信じて、私はただacceptそれがdeprecatedであることを望みますが、このようなことをするための正しい方法を見つけることができません。そのような単純なもののために本当にユニットを作成する必要がありますか?

他の場所で指摘されているように、systemdの下でrc-local.serviceを使用することは適度に不明瞭になります。

  1. 理論的には、ディストリビューションがそれを有効にしない可能性があります。 (これは一般的ではないと思います。たとえば、同じビルドオプションを無効にすると、多くの人が使用するpoweroff/rebootコマンドも削除されるためです)。
  2. セマンティクスは完全に明確ではありません。 Systemdはrc-local.serviceを1つの方法で定義していますが、Debianは少なくとも1つの重要な設定を変更するドロップインファイルを提供しています。

rc-local.serviceはよく機能します。上記について心配している場合は、自分でコピーを作成するだけです!ここに魔法があります:

# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script

[Install]
WantedBy=multi-user.target

すべての詳細を理解する必要はないと思います[*]が、ここで知っておくべきことが2つあります。

  1. systemctl enable my-startup.serviceでこれを有効にする必要があります。

  2. スクリプトがnetwork-online.targetを含む他のサービスに依存している場合は、それを宣言する必要があります。例えば。 [Unit]セクションを追加し、Wants=network-online.targetおよびAfter=network-online.targetという行を追加します。

    「アーリーブート」サービス、特にbasic.targetより前にすでに注文されているサービスへの依存について心配する必要はありません。 my-startup.serviceなどのサービスは、basic.targetを設定しない限り、DefaultDependencies=noの後に自動的に注文されます。

    依存関係の1つが「早期起動」サービスかどうかわからない場合は、basic.targetを実行して、systemctl list-dependencies --after basic.targetより前に注文されたサービスを一覧表示する方法があります。 (これは--afterではなく--beforeであることに注意してください)。

Pre-systemd rc.localにも適用されると思ういくつかの考慮事項があります。

  1. コマンドが、同じものを制御しようとする別のプログラムと競合していないことを確認する必要があります。
  2. 実行時間の長いプログラム、つまりデーモンをrc.localから起動しないことをお勧めします。

[*] Type=oneshot + RemainAfterExit=yesを使用しました。これは、ほとんどのワンショットスクリプトにとってより意味があるためです。これは、一連のコマンドを実行すること、my-startupが完了すると「アクティブ」として表示されること、およびデーモンを起動しないことを形式化します。

19
sourcejedi

rc.localは忘れてください。

CentOS 7について述べた および Debian 8について および buntu 15について

Systemd + Linuxオペレーティングシステムを使用しています。 /etc/rc.localは、systemdの二重下位互換性メカニズムです。これは、それ自体がvan Smoorenburg System 5 rcクローンの互換性メカニズムであったメカニズムの下位互換性メカニズムであるためです。

/etc/rc.localの使用は、ひどく間違っている可能性があります。 systemdが慣れているように、ブートストラップのまったく同じ場所でまったく同じようにrc.localを実行しないという事実に人々は驚いています。 (または誤って期待します:OpenBSDのマニュアルがまだ指摘しているように、古いシステムでは実際にはlastは実行されませんでした。)他の人たちは、 rc.localで設定すると、古い方法で処理されますが、新しいudevルール、NetworkManager、systemd-logindsystemd-resolved、またはさまざまな "キット.

`init 0`がArchのインストールで「過剰な引数」になるのはなぜですか? 」のように、一部のオペレーティングシステムでは、後方にsystemdが提供されていません互換性機能 systemd-rc-local-generatorジェネレータなどDebianは依然として下位互換性機能を保持していますArch Linuxはsystemdをオフにしてビルドします 。したがって、Archやそのようなオペレーティングシステムでは、/etc/rc.localが完全に無視されることを期待しています

rc.localは忘れてください。それは行く方法ではありません。 systemd + Linuxオペレーティングシステムを使用しています。したがって、適切なsystemdサービスユニットを作成し、2レベルの下位互換性から離れたところから始めないでください。 (UbuntuとFedoraでは、3回回削除され、rc.localに続くvan Smoorenburg System 5 rcクローンが2回10年以上前に、最初はupstartで、次にsystemdで置き換えられました。)

systemdへの移行に関する最初のルール も忘れないでください。

これは、systemdに固有の新しいアイデアでもありません。 van Smoorenburg rcおよびUpstartシステムでは、rc.localを使用するのではなく、適切なvan Smoorenburg rcスクリプトまたはUpstartジョブファイルを作成する必要がありました。 FreeBSDのマニュアルでさえ、最近では/etc/rc.localを使用する代わりに適切なMewburn rcスクリプトを作成するようになっています。 Mewburn rcは、2000年にNetBSD 1.5で導入されました。

/etc/rc.localは、第7版Unixの時代以前の日付です。 AT&T Unix System 3では/etc/inittabとランレベルベースのrcに置き換えられました(AT&T Unix System 5では/etc/inittabが少し異なります) 1983年それさえは歴史です。

Noshツールセットのservice-managersystem-control、Mewburnの/etc/rc.d/スクリプトのサービスバンドルかどうかに関係なく、サービス管理システムに適切なネイティブサービス定義を作成しますrc、a systemdのサービスユニットファイル、Upstartのジョブファイル、runit/s6/daemontools-encoreのサービスディレクトリ、またはvan Smoorenburgの/etc/init.d/スクリプトrc

Systemdでは、このような管理者が追加したサービスユニットファイルは通常/etc/systemd/system/に配置されます(またはまれに/usr/local/lib/systemd/system/に配置されます)。 noshサービスマネージャーでは、/var/local/sv/はローカルサービスバンドルの従来の場所です。 FreeBSDのMewburn rc/usr/local/etc/rc.d/を使用します。 Packagedサービスユニットファイルとサービスバンドルを作成している場合は、別の場所に移動します。

参考文献

15
JdeBP

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd の概要

/etc/systemd/system/rc-local.serviceを作成します。

# /etc/systemd/system/rc-local.service
[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

次に:

Sudo touch /etc/rc.local
Sudo chmod +x /etc/rc.local
Sudo systemctl enable rc-local

確認する:

Sudo systemctl start rc-local.service
Sudo systemctl status rc-local.service
2
Ole Tange