Saya punya masalah dengan file layanan systemd (disingkat) ini:
[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
Biarkan FOOd menjadi nama pengguna dan FOO nama grup, yang sudah ada untuk daemon saya /usr/local/bin/FOOd
.
Saya perlu membuat direktori /var/run/FOOd/
sebelum memulai proses daemon /usr/local/bin/FOOd
via # systemctl start FOOd.service
. Ini gagal, karena mkdir tidak dapat membuat direktori karena izin:
...
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
...
Mengapa mkdir gagal di ExecStartPre dan bagaimana cara memperbaikinya? (Dan tidak, saya tidak bisa menggunakan sudo untuk mkdir ...)
permissions
systemd
Mat
sumber
sumber
Jawaban:
Anda perlu menambahkan
untuk
[Service]
. Pengguna AndaFOOd
tentu saja tidak diizinkan membuat direktori di/var/run
. Untuk mengutip halaman manual:sumber
ExecReload=
dijalankan di root privilege. Ini mungkin bukan yang Anda inginkan.PermissionsStartOnly
sudah ditinggalkan. Referensi: github.com/NixOS/nixpkgs/issues/53852 Bagaimana melakukannya sekarang?+
segera setelahnyaExecStartPre=
. MisalnyaExecStartPre=+/bin/mkdir test
Ini bukan jawaban yang menjelaskan atau memperbaiki masalah izin, tapi saya pikir Anda harus menggunakan opsi systemds RuntimeDirectory. Mengutip halaman manual :
Jadi yang harus Anda lakukan adalah mengubah file layanan Anda menjadi:
sumber
Tambahkan
+
sebelum perintah yang ingin Anda jalankan dengan hak penuh.Sebagai contoh:
Lihat bagian "Awalan yang dapat dieksekusi khusus" di https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
sumber