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


26

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

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

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



5
UpstartではなくSystemd !!
比尔盖子

OSの名前とバージョンを指定しますか?
STTR

OS:Arch Linux、バージョン:N / A
比尔盖子

1
@比尔盖子なぜ「最後」なのか、スクリプトの依存関係がわからないのか、それとも最後まで安全にしたいのか?
ポール

回答:


27

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

しかし、以来、あなたは使用せずに道を尋ねたBeforeAfterあなたが使用することができます:

Type=idle

どのようにman systemd.service説明しています。

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


1
こんにちは、前後に使用する場合、構文を詳しく説明してくれますか?
r4ccoon

多少異なるトピックですが、システムプロセスとは別にユーザープロセスを実行したい場合は、askubuntu.com / a / 859583/457417
Ben Creasy

ブートプロセスの最後に設定/proc/sys/kernel/modules_disabledするために完全に機能し1ました
スチュアートカーダル

0

それは本当に「ブート済み」の定義に依存します。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


-2

私は仕様やArchLinuxに詳しくはありませんが、ここではsystemdの一般的な管理方法を示します。

基本的に、systemdは/etc/rcX.dからのシンボリックリンクが指す/etc/init.d/内のスクリプトのコレクションです。ここで、Xは実行レベルの数です。シンボリックリンク自体の形式は次のとおりです。

[K | S] + nn + [文字列]

ここで:

  • nnは、これらのスクリプトの実行順序を決定する数値です
  • stringは、/ etc / init.d /に表示されるスクリプトの名前です
  • 最後に、KまたはSは、スクリプトを呼び出すコマンドを決定します:それぞれ停止または開始。

そのため、ブートシーケンスの最後にスクリプトを実行する場合は、次を実行する必要があります。

  1. スクリプトを/etc/init.d/に置き、実行可能にします
  2. スクリプトを開始するターゲットランレベルを決定します(通常はコンソールの場合は2、グラフィカルユーザーインターフェイスの場合は5)。のようなもので決定することができますrunlevel
  3. このランレベルにすでに存在するスクリプトを見て、既に存在ls /etc/rc<target runlevel>.d/する他のどの番号よりも大きい2桁の数字を選択してください。
  4. update-rc.dDebianベースchkconfig、Fedoraライク、または手動などのディストリビューション固有のユーティリティを使用して、initスクリプトへのシンボリックリンク/etc/rc.d/Sを作成します。

5
説明したのは、実際にはsysVinitです。systemdがsysVinitの動作と互換性があることは事実ですが、重要な違いが1つあります。すべてが並行して実行されます。また、sysVinitサービスとsystemdサービスの2種類のサービスがあります。あなたの答えは、sysVinitサービスの後に何かを実行するのに役立つかもしれませんが、必ずしもsystemdサービスではありません。
サム

1
Systemdは、最初からsysvinitとの互換性を目指していません。
lzap
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.