GNU/Linux >> Linux の 問題 >  >> Linux

Rc.localを再作成する代わりに、SystemdでRc.localを正しく置き換えますか?

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

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

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

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

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

承認された回答:

他の場所で指摘されているように、rc-local.serviceを使用することはやや汚れます systemdの下 。

  1. 理論的には、ディストリビューションでそれが有効にならない可能性があります。 (これは一般的ではないと思います。たとえば、同じビルドオプションを無効にすると、poweroffも削除されるためです。 /reboot 多くの人が使用するコマンド)。
  2. セマンティクスは完全には明確ではありません。 Systemdはrc-local.serviceを定義します 片道ですが、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つが「アーリーブート」サービスであるかどうかわからない場合、1つのアプローチは、basic.targetの前に注文されたサービスを一覧表示することです。 、systemctl list-dependencies --after basic.targetを実行する 。 (--afterであることに注意してください 、--before

関連:入力がyesの場合、スクリプトを再度実行しますか?

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

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

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


Linux
  1. 10の便利なsystemdコマンド:リファレンス

  2. Systemdのスタートアップスクリプトを書く方法は?

  3. 一連のSystemdサービスファイルのユーザーを変更するにはどうすればよいですか?

  1. Linux – SystemdのすべてのデーモンにデフォルトのCPUアフィニティを設定するにはどうすればよいですか?

  2. systemd サービスの ExecStart のコマンド パスで変数を使用する

  3. リモート サーバーで Firefox を起動すると、代わりにローカルの Firefox がページを開きます

  1. cronjobsの代わりにsystemdタイマーを使用する

  2. フレームバッファデバイスでテキストコンソールを開始するSystemdサービスはどれですか?

  3. 永続的な NTFS パーティションの最も正しいマウント ポイントはどれですか?