systemd: vấn đề cấp phép với mkdir & ExecStartPre


37

Tôi đã gặp sự cố với tệp dịch vụ systemd (rút ngắn) này:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
ExecStartPre=/bin/mkdir -p /var/run/FOOd/
ExecStartPre=/bin/chown -R FOOd:FOO /var/run/FOOd/
ExecStart=/usr/local/bin/FOOd -P /var/run/FOOd/FOOd.pid
PIDFile=/var/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Đặt FOOd là tên người dùng và FOO tên nhóm, đã tồn tại cho daemon của tôi /usr/local/bin/FOOd.

Tôi cần tạo thư mục /var/run/FOOd/trước khi bắt đầu quá trình daemon /usr/local/bin/FOOdthông qua # systemctl start FOOd.service. Điều này không thành công, vì mkdir không thể tạo thư mục do quyền:

...
Jun 03 16:18:49 PC0515546 mkdir[2469]: /bin/mkdir: cannot create directory /var/run/FOOd/: permission denied
Jun 03 16:18:49 PC0515546 systemd[1]: FOOd.service: control  process exited, code=exited status=1
...

Tại sao mkdir thất bại tại ExecStartPre và làm cách nào tôi có thể sửa nó? (Và không, tôi không thể sử dụng sudo cho mkdir ...)


FYI: Tôi đang sử dụng Debian 8
Matt

Bạn có thể vui lòng dịch thông báo lỗi sang tiếng Anh?
Vì vậy,

1
... 03/03/2016 : FOOd.service: quá trình kiểm soát đã thoát, code = trạng thái đã thoát = 1 ...
Matt

Câu trả lời:


56

Bạn cần phải thêm

PermissionsStartOnly=true

để [Service]. Người dùng của bạn FOOdtất nhiên không được phép tạo một thư mục trong /var/run. Để trích dẫn trang người đàn ông:

Đưa ra một lập luận boolean. Nếu đúng, các tùy chọn thực thi liên quan đến quyền, như được định cấu hình với User = và các tùy chọn tương tự (xem systemd.exec (5) để biết thêm thông tin), chỉ được áp dụng cho quy trình bắt đầu với ExecStart =, và không áp dụng cho các ExecStartPre = khác Các lệnh, ExecStartPost =, ExecReload =, ExecStop = và ExecStopPost =. Nếu sai, cài đặt được áp dụng cho tất cả các lệnh được định cấu hình theo cùng một cách. Mặc định là sai.


1
Thật tuyệt vời, chính xác những gì tôi đang tìm kiếm.
robert

2
Tùy chọn này làm cho các lệnh ExecReload=chạy trong đặc quyền gốc. Đây có thể không phải là những gì bạn muốn.
Rockallite

@Rockallite đó là những gì tài liệu tôi đã trích dẫn nói theo nghĩa đen, vâng.
embik 18/03/2017

2
PermissionsStartOnlyđã bị phản đối Tham khảo: github.com/NixOS/nixpkgs/issues/53852 Làm thế nào để làm điều đó bây giờ?
adrelanos

2
@adrelanos Bây giờ, thêm +ngay sau đó ExecStartPre=. Ví dụExecStartPre=+/bin/mkdir test
Jamie Scott

28

Đây không phải là một câu trả lời giải thích hoặc khắc phục vấn đề cấp phép, nhưng tôi nghĩ bạn chỉ nên sử dụng tùy chọn RuntimeDirectory của systemds. Trích dẫn trang người đàn ông :

RuntimeDirectory=, RuntimeDirectoryMode=
       Takes a list of directory names. If set, one or more directories by
       the specified names will be created below /run (for system
       services) or below $XDG_RUNTIME_DIR (for user services) when the
       unit is started, and removed when the unit is stopped. The
       directories will have the access mode specified in
       RuntimeDirectoryMode=, and will be owned by the user and group
       specified in User= and Group=. Use this to manage one or more
       runtime directories of the unit and bind their lifetime to the
       daemon runtime. The specified directory names must be relative, and
       may not include a "/", i.e. must refer to simple directories to
       create or remove. 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).

Vì vậy, tất cả những gì bạn cần làm là thay đổi tệp dịch vụ của bạn thành:

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
RuntimeDirectory=FOOd
RuntimeDirectoryMode=$some-mode
ExecStart=/usr/local/bin/FOOd -P /run/FOOd/FOOd.pid
PIDFile=/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

Cảm ơn cảm ơn. Đáng tiếc là thiếu gói Ubuntu OpenVPN !!
BaseZen

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.