मुझे "फ़ाइल बनाने में विफल ... अनुमति अस्वीकृत" त्रुटि क्यों हो रही है?


11

यदि किसी प्रोग्राम को लिखने की अनुमति चाहिए, तो मुझे इसे चाउन के साथ कैसे सेट करना चाहिए? विशेष रूप से, इस त्रुटि को हल करने के लिए फू की अनुमति क्या होगी?

failed to create pid file '/var/run/bar.pid': Permission denied

जवाबों:


7

यदि आपके पास fooफ़ाइल बनाने / लिखने की कोशिश करने वाला कोई प्रोग्राम fooहै, तो बाइनरी की अनुमति मायने नहीं रखती है, लेकिन यह जिस उपयोगकर्ता के रूप में चल रही है वह सभी अंतर बनाता है।

इस मामले में, fooलिखने की कोशिश कर रहा है /var/run, जिसके पास स्वामित्व है rootऔर केवल जड़ से लिखने योग्य है ।

तो आपको sudo fooउस PID फ़ाइल को बनाने के लिए प्रोग्राम को चलाना होगा । प्रोग्राम को रूट करने से पहले उसे चलाने की अनुमति देने के सुरक्षा निहितार्थ पर विचार करें ...


यदि बायनेरिज़ पर अनुमति कुछ है: rw-rr तो क्या प्रोग्राम को निष्पादन योग्य दिया जाएगा कि मैं प्रोग्राम को रूट के रूप में चला रहा हूं अर्थात एक प्रक्रिया आईडी बनाने के लिए अनुमति देता हूं / var / run?
अंकित

@Ankit: यदि किसी बाइनरी में कोई निष्पादन योग्य अनुमति नहीं है, तो यह "रन" नहीं होगा; लेकिन कुछ भी आप रूट के रूप में चला सकता हूँ एक पीआईडी के तहत बनाने के लिए सक्षम हो जाएगा/var/run
ish

वैकल्पिक रूप से, पीआईडी ​​फाइल को कहीं और लिखें (कई एप्लिकेशन आपको पीआईडी ​​फाइल को पथ निर्दिष्ट करने देते हैं)।
मिसेनफोर्ड

1

सामान्य दृष्टिकोण: फ़ाइल का उपयोग करने की कोशिश करने वाले उपयोगकर्ता और समूह का निर्धारण करें। यह अक्सर सॉफ़्टवेयर के कॉन्फ़िगरेशन में पाया जाता है (जैसे कि webservers / mailservers / ...), लेकिन यदि सॉफ़्टवेयर पहले से चल रहा है तो इसका उपयोग करें:

ps aux 

उस प्रक्रिया को देखें जिसके लिए आप एक्सेस अधिकारों को कॉन्फ़िगर करना चाहते हैं। पहला कॉलम आपको बताता है कि यह किस उपयोगकर्ता नाम के तहत चल रहा है।

groups <username>

यह आपको बताएगा कि उपयोगकर्ता किन समूहों से संबंधित है।

सेवा से मिलान करने के लिए फ़ाइल के स्वामी या समूह को बदलें।

नोट 1: जैसा कि प्रश्न बताता है कि फ़ाइल / var / run / में है, मैं मान रहा हूँ कि केवल एक प्रक्रिया को एक्सेस की आवश्यकता है, यदि यह सत्य नहीं है, तो आपको स्वामी या समूह को नहीं बदलना चाहिए, लेकिन आप इस प्रक्रिया को जोड़ने पर विचार कर सकते हैं। 'उपयोगकर्ता को इस फ़ाइल / फ़ोल्डर के लिए समूह या एक नया समूह बनाने के लिए।

नोट 2: मजेदार चीजें एपर्मर के साथ हो सकती हैं, जो एक सुरक्षा प्रणाली है: यह प्रक्रियाओं को लिखने से लेकर फाइलों और फ़ोल्डरों तक, जिनमें वे (फाइल सिस्टम स्तर पर) सभी आवश्यक अधिकार हैं, को रोक सकता है। साथ aa-statusआप देख सकते हैं कि आपकी सेवा के लिए एक विशिष्ट नियम सक्रिय है।


1

मैंने जो कुछ भी किया, वह स्टार्ट-स्टॉप-डिमॉन निष्पादित होने से ठीक पहले एक फ़ोल्डर का निर्माण है। यह काम करता है क्योंकि स्क्रिप्ट को आमतौर पर स्टार्ट अप के दौरान रूट के रूप में निष्पादित किया जाता है। यह सिर्फ फ़ोल्डर को / 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 $?
}

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