systemdユニットファイルのExecStartPreエントリと混同される


23

にディレクトリを作成する必要があるsystemdサービスがあります/runが、そうでない場合は非ルートユーザーとして実行します。ブログの例から、次のソリューションを導き出しました。

[Unit]
Description=Startup Thing

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 -u /opt/thing/doStartup
WorkingDirectory=/opt/thing
StandardOutput=journal
User=thingUser
# Make sure the /run/thing directory exists
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /run/thing
ExecStartPre=/bin/chmod -R 777 /run/thing

[Install]
WantedBy=multi-user.target

魔法はコメントに続く3行にあります。どうやらExecStartPreこのようにルートExecStartとして実行されますが、指定されたユーザーとして実行されます。

ただし、次の3つの質問があります。

  1. -前で何をし/bin/mkdirますか?なぜそこにあるのか、何をするのかわかりません。
  2. ExecStartPreユニットファイルに複数のがある場合、それらはユニットファイル内で見つかった順に連続して実行されますか?または他の方法?
  3. これは実際には、非rootユーザーが使用できるように実行ディレクトリを作成するという私の目標を達成するための最良の手法ですか?

ExecStartPreルートとして実行される理由はPermissionsStartOnly=trueディレクティブです。User指令をExecStartコマンドのみに制限します。freedesktop.org/software/systemd/man/systemd.service.html
cayhorstmann

回答:


30

systemdディレクティブに関する質問についてはman systemd.directives、ディレクティブを説明しているmanページを検索するために使用できます。の場合はExecStartPre=、に文書化されていman systemd.serviceます。

のドキュメントにはExecStartPre=、先頭の「-」を使用してこれらのコマンドの障害が許容されることを示すことが説明されています。この場合、/run/thing既に存在する場合は許容されます。

そこのドキュメントはまた、「複数のコマンドラインが許可され、コマンドが次々と連続して実行される」と説明しています。

ディレクトリを事前作成する方法の改善点の1つは、特定のユーザーによる書き込みのみが必要な場合に、誰でも書き込み可能にすることではありません。より制限されたアクセス許可は、次の方法で実現できます。

 ExecStartPre=-/bin/chown thingUser /run/thing
 ExecStartPre=-/bin/chmod 700       /run/thing

これにより、特定のユーザーがディレクトリを所有し、完全にアクセスできるようになります。


systemd.directivesヒントをありがとう それが役立ちます。
トラビスグリッグス

1
あなたもおそらくカバーする必要がRuntimeDirectoryありRuntimeDirectoryModeます。
-JdeBP

2

#3への回答:

RuntimeDirectory=RuntimeDirectoryMode=ディレクティブを確認してください。完全なドキュメントはこちら。しかし、要約すると(テキストはわずかに変更されますが、本質は残るはずです):

RuntimeDirectory=

       This option take a whitespace-separated list of directory names. The 
       specified directory names must be relative, and may not include "..". If
       set, one or more directories by the specified names will be created
       (including their parents) below /run (for system services) or below 
       $XDG_RUNTIME_DIR (for user services) when the unit is started. Also, the  
       $RUNTIME_DIRECTORY environment variable is defined with the full path of 
       directories. If multiple directories are set, then in the environment 
       variable the paths are concatenated with colon (":").

       The innermost subdirectories are removed when the unit is stopped. It is 
       possible to preserve the specified directories in this case if 
       RuntimeDirectoryPreserve= is configured to restart or yes. The innermost 
       specified directories will be owned by the user and group specified in 
       User= and Group=.

       If the specified directories already exist and their owning user or group 
       do not match the configured ones, all files and directories below the 
       specified directories as well as the directories themselves will have their 
       file ownership recursively changed to match what is configured. As an 
       optimization, if the specified directories are already owned by the right 
       user and group, files and directories below of them are left as-is, even if 
       they do not match what is requested. The innermost specified directories 
       will have their access mode adjusted to the what is specified in 
       RuntimeDirectoryMode=.

       Use RuntimeDirectory= to manage one or more runtime directories for the 
       unit and bind their lifetime to the daemon runtime. This is particularly 
       useful for unprivileged daemons that cannot create runtime directories in 
       /run due to lack of privileges, and to make sure the runtime directory is 
       cleaned up automatically after use. For runtime directories that require 
       more complex or different configuration or lifetime guarantees, please 
       consider using tmpfiles.d(5).


RuntimeDirectoryMode=

       Specifies the access mode of the directories specified in 
       RuntimeDirectory= as an octal number. Defaults to 0755. See "Permissions" 
       in path_resolution(7) for a discussion of the meaning of permission bits.

それを活用するために、これはトリックを行う必要があります:

[Unit]
Description=Startup Thing

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 -u /opt/thing/doStartup
WorkingDirectory=/opt/thing
StandardOutput=journal
User=thingUser
# Make sure the /run/thing directory exists
PermissionsStartOnly=true
RuntimeDirectory=thing
RuntimeDirectoryMode=0777

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