systemd-tmpfilesを実行するsystemd .serviceファイルの書き方


16

systemd-tmpfiles --createsystemdディストリビューションを使用してブートプロセス中に実行する必要があります。したがって、この仕事をする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ファイルに関するヒントはありますか?


freedesktop.org/wiki/Software/systemdでsystemdの豊富なドキュメントを確認してください。独自のファイルでシステムのデフォルトを上書きできます。
フォンブランド

回答:


30

[これはsystemd-tmpfilesの問題に直接対処するものではありませんが、この特定のケースではechoを使用した方がよいことを既に認識していると思います。]

まず、「multi-user.target」は使用したい場合とそうでない場合があります。SysVスタイルのinitのランレベルの概念に精通している場合、マルチユーザーは、GUIではなくコンソールで起動するマルチユーザーシステムであるランレベル3と同等のsystemdです。Xから起動するランレベル5に相当するのは、graphical.targetです。デフォルトでは、シンボリックリンクにすることによって決定される/etc/systemd/system(および/または/lib/systemd/system、中の1つ/etcの一方を却下します/lib)と呼ばれるdefault.targetそれが指す場所を見つけるために、使用LSを:

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

通常のLinuxデスクトップでは、これはgraphical.targetになります。これは、デフォルトのランレベル/ターゲットが何であるかに関係なく、作成しているブートサービスを開始する場合、実際には重要ではありません。ただし、マルチユーザーを使用し、デフォルトがグラフィカルな場合、サービスは発生しません。

サービスに応じて、より適切で特定のターゲットまたはサービスが存在する可能性があります。他の質問に基づいて、default.targetはおそらく問題ありません。注として、「ターゲット」と「サービス」の違いは、サービスに[Service]実際にプロセスを実行するセクションが含まれていることです。ターゲットは、さまざまな「depends」および「requires」ディレクティブを介してサービスをグループ化する方法です。他のターゲットやサービスをトリガーする以外に、それ自体は何もしません。

サービスが開始されるタイミングは、他のサービスが明示的に依存しているサービスによって決まります。ブートプロセスの後半で実行するこのような単純なスタンドアロンイベントの場合、次のディレクティブの組み合わせを使用できます。

[Unit]
After=default.target

[Install]
WantedBy=default.target

「インストール」セクションは、サービスのインストール時に使用されます。「WantedBy」は、このサービスに含めるターゲットを指定します(そのターゲットが実行する場合は実行されますが、nb。これは、他のサービスとの関連で実行されるタイミングを決定しません)。実際には、このサービスをより早くではなく後で実行するため、「After」句を指定します。これは、実際にはWantedByターゲットと同じである必要はなく(通常は同じではありません)、いつ発生してもかまわない場合は完全に省略することができます。私は、他のほとんどのものが指定されたものにチェーンされているものに関連して実行されるという予感で使用していますBefore=default.target(これも使用できます。ターゲットの実行はターゲットが実行される前に評価されます)。

たとえば、「hello world」をコンソールにエコーします。サービス自体については、次の[Service]セクションで説明します。

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

コマンドにはフルパスが必要です。私が単に使用しなかった理由/usr/bin/echo "hello world"は、それが機能しないことであり(出力は/ dev / nullに行くと思います)、echo "hello world" > /dev/console意志を実行するサービスの間、ExecStartディレクティブでシェルリダイレクトを使用すると実験が実証されない。したがって、/ usr / local / bin / helloworldは、その1行のシェルスクリプトecho "hello world" > /dev/consoleです。

Type=forkingシェルスクリプトに必要なに注意してください。

当社の完全な、最小限のサービスファイルは、ちょうどこれらの3つのセクションである([Unit][Service]、および[Install])。インストールするには、ファイルまたはそのファイルへのシンボリックリンクを/ etc / systemd / systemまたは/ usr / lib / systemd / systemのいずれかに配置し、以下を実行します。

systemctl --system enable helloworld

印刷されるはずln -s ...です。これはサービスを実行せず、上記で説明したようにブート時に実行するように設定するだけです。

これで簡単です。 man systemd.unitそしてman systemd.serviceより多くの詳細を持っています。


1
ありがとう、非常に有用な答えと問題が解決しました。ただ、ノート、私のディストリビューション(チャクラLinux)の中default.targetではないが/etc/systemd/system、それだけでだ/usr/lib/systemd/system
eang

コマンドからの出力はログに記録されます(他の場所に記録できますか?)
フォンブランド

/ usr / lib / systemd / ...ファイルはフォールバック(デフォルト)であり、/ etc / systemd / ...にドロップすることになっています
vonbrand

これらの日default.targetはで見つけることができます/lib/systemd/system/default.target
czerasz

1
@czerasz Fedora 27で気づくのsystemctl set-default ...は、にシンボリックリンクを残した場合ですが、のシンボリックリンクを/etc/systemd/system変更しません/lib。つまり、異なるターゲットを指しますが、前者は後者をオーバーライドする必要があります。自分で設定した場合、それが起こる可能性があります。とにかく、私は両方の場所で編集しました。
goldilocks

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.