जवाबों:
यदि आपके पास foo
फ़ाइल बनाने / लिखने की कोशिश करने वाला कोई प्रोग्राम foo
है, तो बाइनरी की अनुमति मायने नहीं रखती है, लेकिन यह जिस उपयोगकर्ता के रूप में चल रही है वह सभी अंतर बनाता है।
इस मामले में, foo
लिखने की कोशिश कर रहा है /var/run
, जिसके पास स्वामित्व है root
और केवल जड़ से लिखने योग्य है ।
तो आपको sudo foo
उस PID फ़ाइल को बनाने के लिए प्रोग्राम को चलाना होगा । प्रोग्राम को रूट करने से पहले उसे चलाने की अनुमति देने के सुरक्षा निहितार्थ पर विचार करें ...
/var/run
सामान्य दृष्टिकोण: फ़ाइल का उपयोग करने की कोशिश करने वाले उपयोगकर्ता और समूह का निर्धारण करें। यह अक्सर सॉफ़्टवेयर के कॉन्फ़िगरेशन में पाया जाता है (जैसे कि webservers / mailservers / ...), लेकिन यदि सॉफ़्टवेयर पहले से चल रहा है तो इसका उपयोग करें:
ps aux
उस प्रक्रिया को देखें जिसके लिए आप एक्सेस अधिकारों को कॉन्फ़िगर करना चाहते हैं। पहला कॉलम आपको बताता है कि यह किस उपयोगकर्ता नाम के तहत चल रहा है।
groups <username>
यह आपको बताएगा कि उपयोगकर्ता किन समूहों से संबंधित है।
सेवा से मिलान करने के लिए फ़ाइल के स्वामी या समूह को बदलें।
नोट 1: जैसा कि प्रश्न बताता है कि फ़ाइल / var / run / में है, मैं मान रहा हूँ कि केवल एक प्रक्रिया को एक्सेस की आवश्यकता है, यदि यह सत्य नहीं है, तो आपको स्वामी या समूह को नहीं बदलना चाहिए, लेकिन आप इस प्रक्रिया को जोड़ने पर विचार कर सकते हैं। 'उपयोगकर्ता को इस फ़ाइल / फ़ोल्डर के लिए समूह या एक नया समूह बनाने के लिए।
नोट 2: मजेदार चीजें एपर्मर के साथ हो सकती हैं, जो एक सुरक्षा प्रणाली है: यह प्रक्रियाओं को लिखने से लेकर फाइलों और फ़ोल्डरों तक, जिनमें वे (फाइल सिस्टम स्तर पर) सभी आवश्यक अधिकार हैं, को रोक सकता है। साथ aa-status
आप देख सकते हैं कि आपकी सेवा के लिए एक विशिष्ट नियम सक्रिय है।
मैंने जो कुछ भी किया, वह स्टार्ट-स्टॉप-डिमॉन निष्पादित होने से ठीक पहले एक फ़ोल्डर का निर्माण है। यह काम करता है क्योंकि स्क्रिप्ट को आमतौर पर स्टार्ट अप के दौरान रूट के रूप में निष्पादित किया जाता है। यह सिर्फ फ़ोल्डर को / var / रन में बनाता है और मालिक को तुरंत बदल देता है, इसलिए एक PID लिखा जा सकता है।
नीचे दिए गए उदाहरण में, मैं / var / रन के सबफ़ोल्डर के अस्तित्व की जांच करता हूं, जहां मैंने पीआईडी को वर्तमान रन उपयोगकर्ता के रूप में रखा है, इस मामले में उपयोगकर्ता 'पी' (क्योंकि मैं एक रास्पबेरी पर हूं)।
इस लिंक को भी देखें क्योंकि यह मेरे लिए बहुत शैक्षिक था: पायथन लिपि को सेवा के रूप में चलाने के लिए , हालांकि, इसने यहां चर्चा की गई समस्या को कवर नहीं किया।
मेरे शेल स्क्रिप्ट का उदाहरण भाग:
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/power/$DAEMON_NAME.pid
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
if [ ! -d /var/run/power ]; then
mkdir /var/run/power/
chown pi:pi /var/run/power/
fi
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
log_end_msg $?
}