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


25

systemdでいくつかのローカルスクリプト(または非常にローカルなコマンド)を実行する正しい方法が見つかりません。この種類のスクリプトのサービス(systemdでユニット)を作成してはいけないことは既に知っています(または必要ですか?)....

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

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

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

はrc.localの場所について尋ねる別の質問を見て、答えはそれを作成して実行許可を与えることでした、私はそれがどこにあるのか知りたくないので、私の質問は本当に重複していないと思います非推奨であることを受け入れるために、この種のことを行うための正しい方法を見つけることができません、私は本当にそのような単純ないくつかのユニットを作成する必要がありますか?


4
systemd「勝つ唯一の動きはプレーしないこと」。あるいは、必要に応じて、systemdユニットを作成できます。私はおそらく今のところrc.localを使用し、それがなくなるときは気にします。
ルイFリベイロ

公式な方法は、サービスのようなユニットを作成することだと思いますか?その方法を回答として投稿してください。
ルチアーノアンドレスマティーニ

1
Ubuntuを試したとき、デスクトップに永続的なssh-agentキャッシングを行うためのユニットを作成しました。/etc/rc.localを指すものを作成することもできますが、システムは今のところ自分でやっているようです。次に/etc/rc.local。
ルイFリベイロ

これは、いくつかの本が/etc/rc.localに何かを置く必要があると言っているかのようにドキュメントを壊しそうです。ドキュメントは壊れていますが、/ etc / rc.localを指すユニットを作成する必要があると言うと、systemdがユニットと競合しているため、ドキュメントが壊れます。あなたが正しいなら、彼らはおそらくそれが非推奨であるかどうかを決定しなかったと信じています、なぜなら彼らはまだ代用品を持っていないからです...彼らがすべての文書が再び壊れると決定したとき。
ルチアーノアンドレスマティーニ

どの種類のスクリプトを実行する必要がありますか?Systemdには多くのユニットタイプがあります。「サービス」は、多くのユニットタイプの1つにすぎません。例えば、マウントユニット、オートマウントユニット、タイマーユニット、ターゲットユニット。それらの1つで問題を解決できますか?
andcoz

回答:


17

他の場所で指摘したように、それが使用することを適度に汚れるrc-local.serviceの下でsystemd

  1. 理論的には、ディストリビューションによって有効にされない可能性があります。(これは一般的ではないと思います。たとえば、同じビルドオプションを無効にすると、多くの人が使用するpoweroff/ rebootコマンドも削除されるためです)。
  2. セマンティクスは完全に明確ではありません。Systemdはrc-local.service1つの方法を定義していますが、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.targetAfter=network-online.target

    「早期起動」サービス、具体的には、以前にすでに注文されたサービスへの依存関係について心配する必要はありませんbasic.target。のようなサービスmy-startup.servicebasic.target、設定しない限り、後に自動的に注文されDefaultDependencies=noます。

    依存関係の1つが「アーリーブート」サービスであるかどうかわからない場合、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が完了すると「アクティブ」として表示され、デーモンを起動しないことを形式化します。


さて、サービスやスニペットなどを作成するためのある種の「ローカル」な場所があります-または、これがローカルであり、変更しないでください。独自のデーモンを開発する場合 私はシステムのオリジナル性を変えたくないので、apt-getをインストールするとき、スクリプトの置き換え、またはこのような何かのためにシステムが燃えているのを見たくありません。私はちょうどそれが壊れている場合など、無限のようにそれを再起動しようとしているような...私は恐れていることを任意の追加のクレイジーなことをやってなくて、一度だけ起動されますデーモンを信頼したい...
ルチアーノ・アンドレスマティーニ

1
@LucianoAndressMartiniデーモンを起動する正しい方法を尋ねる場合は、個別のサービスを実際に定義する必要があります。それはネイティブのシステム.serviceユニットである場合があります。または、LSB initスクリプトを本当に書きたい場合は、代わりにそれを行うことができます。いくつかのデーモンrc-local.serviceまたは同等のデーモンを入れることはお勧めしませんでしたが、おそらく動作すると思いますが、systemctl restart my-daemon他のデーモンと同じように個々のデーモンを再起動できると、はるかに良いようです。ローカルサービスをに配置することを意図しています/etc/systemd/system
sourcejedi

1
@LucianoAndressMartini他のサービスと同じ名前を使用することを避ける必要があります-sysvinitのように。同様の状況で、私は時々local-...で私の名前を始めました
-sourcejedi

1
ありがとうございました!!!半日後に保存されました。これらの詳細は私にとって重要でした:Type = oneshot、RemainAfterExit = yes、Wants = network-online.target、After = network-online.target。Apacheのビルドを展開し、静的IPを192.168.1.80に設定するだけで、ルーターはそこにトラフィックを転送できます。簡単なはずです。Debian9では迷惑です。「apt-get apache」、「systemctl start apache」、またはinit.dを含む指示以外のオンラインアドバイスはほとんどありません。これらはDebian9でのソースビルドのApacheには適用されません。
MichaelsonB​​ritt

1
@MichaelsonB​​ritt rc.localからデーモンと呼ばれる長時間実行されるプログラムを起動しないことが最善です。私は使用しましたType=oneshot...それはそれを形式化します...あなたはデーモンを起動しません。デーモンの起動に関する情報が必要な場合は、新しい質問をしてください。
sourcejedi

15

忘れてくださいrc.local

CentOS 7Debian 8Ubuntu 15 について私が言ったよう

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

使用/etc/rc.localすると、ひどく間違ってしまう可能性があります。人々は、systemdがrc.localブートストラップのまったく同じ場所で、以前とまったく同じ方法で実行されないという事実に驚いています。(または、誤って期待:それは、実際には、実行されなかった最後。OpenBSDのマニュアルはまだ指摘するように、旧システムで)その他は、彼らが中に設定したものという事実に驚いてきたrc.local物事の古い方法を期待していますその後、完全に新しいの同類によって取り消さudev、NetworkManagerを、規則systemd-logindsystemd-resolvedまたは「キット」の様々な。

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

忘れてくださいrc.local。行く方法ではありません。systemd + Linuxオペレーティングシステムがあります。そのため、適切なsystemdサービスユニットを作成し、後方互換性が2レベル離れているところから始めないでください。(UbuntuとFedoraの上で、それがされ3回は、バンSmoorenburgシステム5削除rc続くクローンrc.local続いていた自身二度十年以上前、最初の新興企業で、その後にsystemdによって、取って代わられます。)

systemdに移行するための最初のルールも覚えておいてください

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

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

それは間食ツールセットのためのサービスバンドルなるかどうか、あなたのサービス管理システムのための適切なネイティブサービス定義を作成service-managerしてsystem-control/etc/rc.d/Mewburn氏のスクリプトrc、にsystemdのためのサービスユニットファイル、成り上がりのためのジョブファイル、値Runit / S6 / daemontoolsのためのサービスディレクトリ-encore、または/etc/init.d/van Smoorenburgのスクリプトrc

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

参考文献


2
@LucianoAndressMartiniより良い質問は、systemdサービスでrc.localの特定のスニペットを処理する方法です。特定のスニペットを念頭に置いている場合(一部のソフトウェアのドキュメントの手順に言及している場合)、代わりにそのスニペットについての質問を投稿してください。変換に使用できる特定の一般的な規則がありますが、実行しているソフトウェアの機能(フォアグラウンドで実行する、デーモン化を試行しないなど)を利用して特定のケースについて尋ねることで、より多くのことを得ることができます役立つかもしれません。
フィルブランデン

4
1983年以降廃止されていないかどうか疑問に思うかもしれません。
ダンカーター

4
この答えは説教的であり、実際には単純な「代わりにどのような些細なことをすべきか」という質問に答えることに失敗します。それは情報を含んでいて、大量の参照を提供するかもしれませんが、スタック交換の目的を無効にします。
GPS

linuxが進化していない理由として、これを(rc.localの終わり)とDNS解決の問題とともに取り上げますが、実際にはスパゲッティコードになりつつあるため、systemdは多くの人にとってブラックボックスになっています。ユーザーまたは管理者がrc.localに何かを入れたいが、もうできない場合、数分ではなく数日で同じ最終結果を達成するために、最初にsystemdまたは他の説教を強制するのは無意味です。もちろん、ばかはうまく機能し、使いやすいすべてのもので愚かなことをすることができます。
ジュリアス

2

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

systemdが提供するものを使用しますStandardOutput=journal+console(コンソールは例ではttyと同等です)。これは、トラブルシューティングにはるかに役立つようです。のサポートSysVStartPriority=もある時点で削除されました。たぶん、あなたはどれほど重要かをコメントしSysVStartPriority=たり、削除したりできます。それとは別に、それはまともな答えです。
sourcejedi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.