systemd-tmpfiles --create
起動中にsystemdディストリビューションを実行する必要があります。したがって、操作を実行するにはsystemd .serviceファイルを作成する必要があります。
この質問では、私に必要なものとその理由に関するすべての詳細を読むことができます。systemd-tmpfilesはどのように機能しますか?
私はそれに関するいくつかのドキュメントを読んで、次のテストを書いています。
[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target # see details in the link above
[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create
[Install]
WantedBy=multi-user.target
systemd-tmpfiles
しかし、単なるプログラムではなく、systemd自体の一部であるのでよくわかりません。私は私のシステムを壊したくありません。
正しい.serviceファイルに関する提案はありますか?
ベストアンサー1
[これはsystemd-tmpfilesの問題を直接解決しませんが、この特別なケースではechoを使用する方が良いことに気づくでしょう。 ]
まず、「multi-user.target」は、使用したいものでもそうでないかもしれません。 SysVスタイルのinitエントリのランレベルの概念に精通している場合、マルチユーザーはGUIの代わりにコンソールから起動するマルチユーザーシステムであるsystemdのランレベル3と同じです。 Xのランレベル5で起動するのと同じ例グラフィックターゲット。デフォルト値は/etc/systemd/system
(および/またはのシンボリックリンクによって決定されます/lib/systemd/system
。のシンボリックリンクは/etc
のシンボリックリンクをオーバーライドします/lib
)基本ターゲット、lsを使用してそれが指す場所を見つけます。
»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target
systemctl get-default
この場合、「multi-user.target」が表示されます。一般的なLinuxデスクトップの場合グラフィックターゲット。デフォルトの実行レベル/ターゲットに関係なく、作成中のブートサービスを開始したい場合は特に問題はありません。この場合、エイリアスが何であるかを心配せずにdefault.targetを使用できます。ただし、マルチユーザーを使用し、デフォルト設定がグラフィックの場合、サービスは発生しません。
サービスによっては、より適切で具体的な目標や関連サービスをリリースしたい場合があります。他の質問によると、default.targetは大丈夫かもしれません。 「ターゲット」と「サービス」の違いは、サービスには[Service]
実際にプロセスを実行する部分が含まれていることです。ターゲットは、さまざまな「依存」および「要求」ディレクティブを介してサービスをグループ化する方法にすぎません。他のものをトリガーすることは、ターゲットやサービスの外部でそれ自体は何もしません。
サービスの開始時期は、そのサービスに明示的に依存する他のサービスによって異なります。起動プロセスの後半で実行したい単純なスタンドアロンイベントの場合は、次の組み合わせの組み合わせを使用できます。
[Unit]
Requires=local-fs.target
After=local-fs.target
[Install]
WantedBy=default.target
サービスをインストールする場合は、インストールセクションを使用します。 "WantedBy=" は、サービスを含めるターゲットを指定します。つまり、対象にサービスが含まれている場合は、そのサービスが実行されます。特定の依存関係がない場合は、デバイスをより速く実行するのではなく、後で実行するには正常なものを調べて、依存関係またはオプションの前提条件として使用する項目を選択する必要があります。
区別:合格依存私の言葉は、あなたのユニットも何かを活性化して渡さなければならないという意味です。オプションの前提条件私の言葉はあなたのデバイスの前に実行する必要があることを意味します。もし使用中ですが必須ではありません。この用語は私の用語ですが、特にこの意味でシステム文書で使用される重要な区別です。デバイスが次の場合、起動に必要な依存関係が保証されます。しかし、この要件は影響を与えません。始まる順序つまり、単に依存関係のあるタスクが実際に後で開始できることを意味します(例えば、ユニットが最初に開始される可能性があるため、依存関係が成功するという保証はありません)。
Requires
上記は、デバイスlocal-fs.target
が含まれていないシステムで使用されるとは思わない限りわずかに無意味ですAfter
。したがって、これを行うことはできませんRequires
。依存しないデバイスの後に起動するようにデバイスを設定することができるため、「以降」には「必須」=オプションの前提条件はありません。ここの例は、依存関係と実行順序の概念と違いを紹介するためのものです。 1つはもう1つを決定しません。
「開始」は、前提条件が自己実行の特定のポイントに達するという意味ではありません。たとえば、リモートファイルシステムのマウントに関するものであり、これがデバイスにとって重要な場合は、そのサービスを有効にして設定する必要があるかもしれませんが、Requires
適切After
なエラー処理を実行するにはまだ実際のプロセスを実行する必要があります。リモートファイルシステムの破損。ファイルシステムにはまだアクセスできません(たとえば、アクセスできるまでループ状態で待機)。
たとえば、「hello world」をコンソールに表示します。サービス自体[Service]
は次のセクションで説明されています。
[Service]
Type=simple
ExecStart=/usr/local/bin/helloworld
このコマンドにはフルパスが必要です。私が使用しない理由/usr/bin/echo "hello world"
はうまくいかないことです(出力が/ dev / nullになると思いました)。サービスが喜んで実行されている間、実験によると、echo "hello world" > /dev/console
ExecStartディレクティブ内でシェルリダイレクトを使用すると、そうではありません。ExecStart
コマンドによる操作シェルとして実行されない。しかし、次のようにすることができます。 /usr/local/bin/helloworldは、1行を含むシェルスクリプトですecho "hello world" > /dev/console
。
注Type=simple
これは、helloworld
実行中の作業や他の多くの作業に適しています。サービスが長時間(数秒以上)実行されている場合、systemdは使用中にそれをバックグラウンドに分岐しますsimple
。これはユーザーが望むものです(別のオプションは、あまりにも長い間フォアグラウンドにとどまっているため、分岐することです)。ただし、プログラムが独自にフォークを実行している場合(サーバーとデーモンが頻繁に実行するように)、フローティング孤立プロセスで終了することを使用する必要がありますType=forking
。 「type」パラメータは、何をしようとしても読まなければならないことsimple
で詳しく扱っています。2man systemd.service
私たちの完全な最小限のサービスファイルには、これら3つの部分([Unit]
、、[Service]
および[Install]
)のみがあります。インストールするには、ファイルまたはそのシンボリックリンクを/etc/systemd/systemまたは/usr/lib/systemd/systemに配置してから、次の手順を実行します。
systemctl --system enable helloworld
印刷する必要がありますln -s ...
。これは、サービスを実行せずに上記のように起動時に実行するように構成するだけです。
簡単に言えば、それはすべてです。 man systemd.unit
そしてさらにman systemd.service
詳細があります(しかし、これらすべてのためのインデックスがありますman systemd.directives
)。
ブロックのパラメータ
StandardOutput
とパラメータを使用してStandardError
出力をリダイレクトできます。[Service]
を参照してください。man systemd.exec
すべてのサービスファイルディレクティブのインデックスがあり
man systemd-directives
、これはそのディレクティブが文書化されているマニュアルページを表します。たとえば、次のようになります。After= systemd.unit(5) Alias= systemd.unit(5)