systemd: mkdir और ExecStartPre के साथ अनुमति समस्या


37

मैं इस (छोटा) systemd सेवा फ़ाइल के साथ एक समस्या है:

[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

चलो खाना उपयोगकर्ता नाम और हो FOO समूह का नाम है, जो पहले से ही अपने डेमॉन के लिए मौजूद हैं /usr/local/bin/FOOd

के माध्यम से /var/run/FOOd/डेमॉन प्रक्रिया शुरू करने से पहले मुझे निर्देशिका बनाने की आवश्यकता है । यह विफल हो जाता है, क्योंकि mkdir अनुमतियों के कारण निर्देशिका नहीं बना सकता है:/usr/local/bin/FOOd# systemctl start FOOd.service

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

ExecStartPre पर mkdir क्यों विफल हो जाता है और मैं इसे कैसे ठीक कर सकता हूं? (और नहीं, मैं mkdir के लिए sudo का उपयोग नहीं कर सकता ...)


FYI करें: मैं डेबियन 8 का उपयोग कर रहा हूँ
मैट

क्या आप कृपया त्रुटि संदेश का अंग्रेज़ी में अनुवाद कर सकते हैं?
तुशी

1
... Jun 03 16:18:49 PC0515546 mkdir [2469]: / बिन / mkdir: निर्देशिका / var / run / FOOd / नहीं बनाया जा सकता: कोई अनुमति नहीं Jun 03 16:18:49 PC0515546 systemd [1] : FOOd.service: नियंत्रण प्रक्रिया से बाहर हो गया, कोड = बाहर निकलने की स्थिति = 1 ...
मैट

जवाबों:


56

आपको जोड़ने की आवश्यकता है

PermissionsStartOnly=true

को [Service]। आपका उपयोगकर्ता FOOdबेशक एक निर्देशिका बनाने के लिए अधिकृत नहीं है /var/run। आदमी पृष्ठ का हवाला देते हैं:

एक बूलियन तर्क लेता है। यदि सत्य है, तो उपयोगकर्ता = और इसी तरह के विकल्प (अधिक जानकारी के लिए systemd.exec (5) देखें) के साथ अनुमत अनुमति-संबंधी निष्पादन विकल्प, केवल ExecStart = के साथ शुरू की गई प्रक्रिया पर लागू होते हैं, और विभिन्न अन्य ExecStartPre = के लिए नहीं। , ExecStartPost =, ExecReload =, ExecStop =, और ExecStopPost = कमांड। यदि गलत है, तो सेटिंग को सभी कॉन्फ़िगर कमांड पर उसी तरह लागू किया जाता है। झूठे की अवहेलना करता है।


1
अद्भुत, वास्तव में मैं क्या देख रहा था।
रॉबर्ट

2
यह विकल्प ExecReload=रूट विशेषाधिकार में रन बनाने के लिए आदेश देता है । यह वह नहीं हो सकता जो आप चाहते हैं।
रॉकलाईट

@ रॉकलाइट वह दस्तावेज है, जिसका मैंने शाब्दिक उल्लेख किया है, हां।
embik

2
PermissionsStartOnlyपदावनत कर दिया गया। संदर्भ: github.com/NixOS/nixpkgs/issues/53852 अब ऐसा कैसे करें?
एड्रेलानोस

2
@adrelanos अब, इसके +तुरंत बाद जोड़ें ExecStartPre=। उदाहरण के लिएExecStartPre=+/bin/mkdir test
जेमी स्कॉट

28

यह एक ऐसा उत्तर नहीं है जो अनुमति की समस्या को समझाता है या ठीक करता है, लेकिन मुझे लगता है कि आपको सिर्फ़ RuntimeDirectory विकल्प का उपयोग करना चाहिए। आदमी पृष्ठ का हवाला देते हुए :

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

तो आपको बस इतना करना होगा:

[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

शुक्रिया शुक्रिया। OpenVPN Ubuntu पैकेज से दुखी!
बेसजेन

4

+उस कमांड से पहले जोड़ें जिसे आप पूरे विशेषाधिकारों के साथ चलाना चाहते हैं।

उदाहरण के लिए:

ExecStartPre=+/bin/mkdir test

Https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart= पर "विशेष निष्पादन योग्य उपसर्ग" पर अनुभाग देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.