システム単位ファイルのExecStartPreエントリについて混乱

システム単位ファイルのExecStartPreエントリについて混乱

にディレクトリを作成する必要があるシステムサービスがありますが、/runrootではなくユーザーとして実行します。ブログの例では、次の解決策を考えました。

[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この方法でrootとして実行されますが、指定ExecStartされたユーザーとして実行されます。

ただし、これにより、次の3つの問題が発生します。

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

答え1

systemdディレクティブに関する質問がある場合は、man systemd.directivesそのディレクティブを説明するマニュアルページを参照してください。の場合ExecStartPre=に説明されていますman systemd.service

のドキュメントには、ExecStartPre=これらのコマンドが失敗を許可できることを示すために、前に「-」が使用されるという説明があります。この場合、/run/thingすでに存在する場合は許可されます。

ドキュメントでは、「複数のコマンドラインが許可され、コマンドが順次実行されます」と説明されています。

事前に作成されたディレクトリアプローチの改善は、特定のユーザーだけが書き込む必要があるディレクトリを誰でも書き込むことができないことです。以下により、より制限された権限を達成できます。

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

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

答え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

関連情報