にディレクトリを作成する必要があるシステムサービスがありますが、/run
rootではなくユーザーとして実行します。ブログの例では、次の解決策を考えました。
[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つの問題が発生します。
-
前部は何をするか/bin/mkdir
。それがなぜそこにいるのか、何をしているのかわかりません。- ユニットファイルに 'が複数ある場合、
ExecStartPre
ユニットファイル内の順に順番に実行されますか?それとも別の方法? - これは、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
これにより、特定のユーザーがディレクトリを所有して完全にアクセスできるようになります。