web-dev-qa-db-ja.com

起動時の最後のサービスとしてsystemdサービスをどのように作成しますか?

何年も前に、スタートアップスクリプトを/etc/rc.localに書き込むことができます。すべてのシステムサービスが読み込まれた後、スクリプトが実行されます。

現在、systemdを使用しています。rc.localはもうありません。 Systemdはサービスを並行して開始します。 rc.local`として機能する独自のサービスを作成することはできますが、すべてのシステムサービスが読み込まれた後にサービスが確実に実行されるとは限りません。

それを行う方法はありますか?または、systemdサービスファイルでBeforeおよびAfterを使用する必要がありますか?

29
比尔盖子

Systemdでは、Before=After=を使用して、他のサービスを中心にサービスを適切に注文することをお勧めします。

しかし、BeforeAfterを使用しない方法を求めたので、以下を使用できます。

Type=idle

man systemd.service の説明:

idleの動作はsimpleとよく似ています。ただし、サービスプログラムの実際の実行は、すべてのアクティブなジョブがディスパッチされるまで遅延されます。これは、シェルサービスの出力とコンソールのステータス出力のインターリーブを回避するために使用できます。このタイプはコンソール出力を改善するためにのみ役立ち、一般的なユニット注文ツールとしては役に立たないことに注意してください。このサービスタイプの効果は5秒のタイムアウトの影響を受け、その後サービスプログラムが呼び出されます。

29
SimonPe

それは本当にあなたの「起動」の定義に依存します。 gettyが起動した直後に実行したいと思います。これを行うには、サービスを/etc/systemd/system/getty.target.wants/ディレクトリに追加する必要があります。また、ファイルがこのディレクトリ内の他のサービスと同様のコードを使用していることを確認する必要があります。起動時とシャットダウン時にカスタムサービスを実行するには(マザーボードのブザーを鳴らすだけ)/etc/systemd/system/getty.target.wants/service_name.serviceで次のスクリプトを使用します

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.shは実行可能で、最初にシバンがあります。

ブートのこの時点ですべてが開始されるわけではありませんが、これがログオンプロンプトがユーザーに表示される時点です。

これはBefore=After=を使用しますが、私にとってははるかに理解しやすく、実際に機能しました。上記の回答は十分な情報を得られませんでした。これにより、ExecStart=のようなサービスに限定されるのではなく、ExecStop=Type=simpleの両方を使用できるようになります。

0
Hack5