ローカルを実行する正しい方法が見つかりません 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
の下 。
- 理論的には、ディストリビューションでそれが有効にならない可能性があります。 (これは一般的ではないと思います。たとえば、同じビルドオプションを無効にすると、
poweroff
も削除されるためです。 /reboot
多くの人が使用するコマンド)。 - セマンティクスは完全には明確ではありません。 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つあります。
-
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つが「アーリーブート」サービスであるかどうかわからない場合、1つのアプローチは、
basic.target
の前に注文されたサービスを一覧表示することです。 、systemctl list-dependencies --after basic.target
を実行する 。 (--after
であることに注意してください 、--before
。
pre-systemd rc.local
にも適用されると思ういくつかの考慮事項があります :
- コマンドが、同じことを制御しようとする別のプログラムと競合していないことを確認する必要があります。
-
rc.local
からデーモンとも呼ばれる長時間実行プログラムを開始しないことをお勧めします。 。
[*] Type=oneshot
を使用しました + RemainAfterExit=yes
ほとんどのワンショットスクリプトの方が理にかなっているからです。これは、一連のコマンド、つまりmy-startup
を実行することを形式化したものです。 完了すると「アクティブ」として表示され、デーモンは起動しません。