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
を使用することは適度に不明瞭になります。
poweroff
/reboot
コマンドも削除されるためです)。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つあります。
systemctl enable my-startup.service
でこれを有効にする必要があります。
スクリプトが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
にも適用されると思ういくつかの考慮事項があります。
rc.local
から起動しないことをお勧めします。[*] Type=oneshot
+ RemainAfterExit=yes
を使用しました。これは、ほとんどのワンショットスクリプトにとってより意味があるためです。これは、一連のコマンドを実行すること、my-startup
が完了すると「アクティブ」として表示されること、およびデーモンを起動しないことを形式化します。
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-logind
、systemd-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-manager
とsystem-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サービスユニットファイルとサービスバンドルを作成している場合は、別の場所に移動します。
rc.local
。 FreeBSDシステムマネージャのマニュアル。 2016年4月23日。/etc/rc.local
またはchmod -x
itを削除します。 Redhatバグ#734268。rc.local
は早くから始まっています。 systemdバグ#7703rc.local
を使用する場合の場合。bencane.com。/etc/inittab
は過去のものです。 。よくある答え。systemd.unit
マニュアルページからのシステム検索パスがありません "。 systemd docoのエラッタ。よくある答え。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