systemd: mkdir ve ExecStartPre ile izin sorunu


37

Bu (kısaltılmış) sistemd servis dosyasıyla ilgili bir sorunum var:

[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

Let GIDA kullanıcı adı ve olmayacak FOO zaten benim cini için var grubu, /usr/local/bin/FOOd.

Ben dizin oluşturmak için gereken /var/run/FOOd/servis sürecini başlatmadan önce /usr/local/bin/FOOdaracılığıyla # systemctl start FOOd.service. Bu başarısız olur, çünkü mkdir, izinler nedeniyle dizini oluşturamaz:

...
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
...

Mkdir ExecStartPre'de neden başarısız oluyor ve nasıl düzeltebilirim? (Ve hayır, mkdir için sudo kullanamıyorum ...)


FYI: Debian 8
Matt

Lütfen hata mesajını İngilizce’ye çevirebilir misiniz?
Thushi

1
... Jun 03 16:18:49 PC0515546 mkdir [2469]: / bin / mkdir: / var / run / FOOd dizini / oluşturulamıyor: izin yok Jun 03 16:18:49 PC0515546 systemd [1] : FOOd.service: kontrol işlemi çıktı, kod = durumdan çıkıldı = 1 ...
Matt

Yanıtlar:


56

Eklemelisin

PermissionsStartOnly=true

için [Service]. FOOdElbette, kullanıcınız içinde bir dizin oluşturmak için yetkili değil /var/run. Man sayfasını alıntı yapmak için:

Boolean bir argüman alır. Değer doğruysa, User = ve benzer seçeneklerle yapılandırıldığı şekilde izinle ilgili çalıştırma seçenekleri (daha fazla bilgi için bkz. Systemd.exec (5)), yalnızca ExecStart = ile başlayan işleme uygulanır, diğer çeşitli ExecStartPre = , ExecStartPost =, ExecReload =, ExecStop = ve ExecStopPost = komutları. False olursa, ayar yapılandırılan tüm komutlara aynı şekilde uygulanır. Varsayılan olarak false.


1
Harika, tam olarak aradığım şeydi.
robert

2
Bu seçenek, komutları ExecReload=çalıştırmada root ayrıcalığına getirir . İstediğin bu olmayabilir.
Rockallite

@Rockallite, tam olarak bahsettiğim belgelerin söylediği şey, evet.
00’de embik

2
PermissionsStartOnlykullanımdan kaldırıldı. Referans: github.com/NixOS/nixpkgs/issues/53852 Şimdi nasıl yapılır?
adrelanos

1
@ adrelanos Şimdi +hemen sonra ekleyin ExecStartPre=. ÖrneğinExecStartPre=+/bin/mkdir test
Jamie Scott

28

Bu, izin sorununu açıklayan veya düzelten bir cevap değildir, ancak sadece systemd RuntimeDirectory seçeneğini kullanmanız gerektiğini düşünüyorum. Man sayfasından alıntı :

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).

Tek yapmanız gereken hizmet dosyanızı şu şekilde değiştirmek:

[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

Teşekkür ederim teşekkür ederim. Ne yazık ki OpenVPN Ubuntu paketinden eksik !!
BaseZen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.