시스템 단위 파일의 ExecStartPre 항목으로 혼동 루트로 실행되지만

에 디렉토리를 만들어야 /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. 루트가 아닌 사용자가 사용할 수 있도록 실행 디렉토리를 작성하려는 목표를 달성하는 데 실제로 이것이 가장 좋은 기술입니까?


답변

체계적 지시문에 대한 질문이 있으면 지시문 man systemd.directives을 설명하는 매뉴얼 페이지를 조회하는 데 사용할 수 있습니다 . 의 경우에 ExecStartPre=문서화되어 man systemd.service있습니다.

에 대한 문서에는 ExecStartPre=이러한 “-“를 사용하여 이러한 명령에 대해 실패가 허용된다는 것을 설명합니다. 이 경우 /run/thing이미 존재하는 경우 허용됩니다 .

또한이 문서에서는 “여러 명령 줄이 허용되며 명령이 차례로 순차적으로 실행됩니다”라고 설명합니다.

디렉토리를 사전 작성하는 방법의 한 가지 개선 사항은 특정 사용자가 디렉토리를 쓸 수 있어야하는 경우에만 디렉토리에 글을 쓸 수있는 것은 아닙니다. 보다 제한된 권한은 다음을 통해 달성됩니다.

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

그러면 디렉토리가 소유하고 특정 사용자가 완전히 액세스 할 수 있습니다.


답변

# 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


답변