システム単位ファイルの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

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

おすすめ記事