किसी अन्य उपयोगकर्ता के रूप में एक स्क्रिप्ट शुरू करना


12

मैंने /etc/init.d/ में एक स्क्रिप्ट बनाई है, जिसमें अपने घर निर्देशिकाओं से अन्य (गैर-रूट विशेषाधिकार प्राप्त) उपयोगकर्ताओं की कई स्क्रिप्ट्स को चलाना है, जैसे कि उन्होंने उन्हें शुरू किया।

मैं इन लिपियों को लॉन्च करता हूं: sudo -b -u <username> <script_of_a_particular_user>

और यह काम करता है। लेकिन प्रत्येक उपयोगकर्ता स्क्रिप्ट के लिए जो जारी है (उदाहरण के लिए कुछ प्रहरी) मैं एक संबंधित माता-पिता की सूडो प्रक्रिया देखता हूं, फिर भी जीवित और रूट के रूप में चल रहा है। यह सक्रिय प्रक्रियाओं की सूची में गड़बड़ी पैदा करता है।

तो मेरा प्रश्न यह है: मैं किसी अन्य उपयोगकर्ता के रूप में मौजूदा बैश स्क्रिप्ट से किसी अन्य स्क्रिप्ट को कैसे लॉन्च (कांटा) कर सकता हूं और इसे एक अनाथ (अकेले खड़े) प्रक्रिया के रूप में छोड़ सकता हूं?

अधिक विस्तृत विवरण:
मैं मूल रूप से मशीन पर अन्य उपयोगकर्ताओं को प्रदान करने की कोशिश कर रहा हूं, जो कि सिस्टम स्टार्ट या सिस्टम शटडाउन पर सामान चलाने के लिए है, जो उनके घर निर्देशिका में पाए गए संबंधित उपनिर्देशिकाओं में पाई गई निष्पादन योग्य फ़ाइलों को चलाकर, .startUp और .shutDown में पाया जाता है। चूँकि मुझे ऐसा करने के लिए कोई अन्य साधन नहीं मिला, इसलिए मैंने अपनी bash स्क्रिप्ट लिखी जो ठीक वैसा ही करती है और मैंने इसे /etc/init.d/ में एक सर्विस स्क्रिप्ट (कंकाल उदाहरण के बाद) के रूप में कॉन्फ़िगर किया है, इसलिए जब इसे चलाया जाता है प्रारंभ तर्क के साथ यह .startUp निर्देशिकाओं से सब कुछ लॉन्च करता है और जब इसे स्टॉप तर्क के साथ चलाया जाता है तो यह सभी उपयोगकर्ताओं के .shutown निर्देशिकाओं को उनके रूप में लॉन्च करता है।

वैकल्पिक रूप से मुझे भी दिलचस्पी है अगर मैं इस समस्या को हल करने के लिए कुछ मौजूदा समाधान का उपयोग कर सकता था।

अद्यतन
मैंने थोड़ा चारों ओर देखा है और मुझे यह प्रश्न मिला: /unix/22478/detach-a-daemon-use-sudo

उपयोग करने के लिए, वहाँ जवाब स्वीकार किया: sudo -u user sh -c "daemon & disown %1"मेरे लिए काम करता है। लेकिन मैंने भी % 1 को बिना बताए आजमाया और यह वैसा ही है। तो यह वही है जो मेरे लिए काम करता है जैसा कि मैंने उम्मीद की थी:

sudo -u <username> bash -c "<script_of_a_particular_user> &"

मेरा अतिरिक्त सवाल अब यह है कि यह बिना डिस्क्राइब किए काम क्यों कर रहा है? क्या मुझे कुछ संभावित विशेष मामले के लिए, अभी भी, डिसाइड कॉल को छोड़ देना चाहिए ?

अद्यतन २

जाहिरा तौर पर यह भी काम करता है:

su <username> -c "<script_of_a_particular_user> &"

क्या इस कॉल और सुडो कॉल में कोई अंतर है? मुझे पता है कि यह संभावित रूप से एक अलग सवाल है। लेकिन जब से मैं यहाँ खुद के जवाब मिल रहा है शायद इस विषय के लिए किसी को यहाँ स्पष्ट कर सकता है।

अद्यतन 3
सु या सूडो के साथ ये दोनों विधियाँ अब मशीन को बूट करने के बाद एक नई स्टार्टर प्रक्रिया (रूट के रूप में चलने वाली एकल प्रक्रिया) का उत्पादन करती हैं। प्रक्रिया सूची में दृश्यमान है:

startpar -f -- <name_of_my_init.d_script>

यह प्रक्रिया क्यों पैदा की गई है? जाहिर है कि मैं कुछ गलत कर रहा हूं क्योंकि किसी अन्य init.d स्क्रिप्ट में यह प्रक्रिया नहीं चल रही है।

अद्यतन 4
शुरुआत के साथ समस्या हल हो गई है। मैंने उसके लिए एक और सवाल शुरू किया है: आरपार या
आईआईटी .00 से प्रक्रिया शुरू करते समय स्टार्टर प्रक्रिया लटकी हुई है

और गैर-विशेषाधिकार प्राप्त उपयोगकर्ताओं के लिए लॉन्चिंग तंत्रों पर आगे चर्चा करने के लिए एक और सवाल:
सामान्य उपयोगकर्ताओं (गैर-रूट) को आरंभीकरण और शटडाउन ऑटो-रन क्षमताओं के साथ प्रदान करना

जवाबों:


18

इसका सही उत्तर यह था कि उचित "डीमोनेटाइजेशन" के लिए, मानक इनपुट, मानक आउटपुट और मानक त्रुटि को / dev / null (या कुछ वास्तविक फ़ाइल) पर पुनर्निर्देशित किया जाना चाहिए:

su someuser -c "nohup some_script.sh >/dev/null 2>&1 &"

su - स्थानापन्न उपयोगकर्ता पहचान someuser
-c - su तर्क के लिए निर्दिष्ट कमांड
nohup चलाने के लिए - हैंगअप के लिए एक कमांड इम्यून चलाएँ। उन मामलों को रोकने के लिए जहां माता-पिता की प्रक्रिया बच्चे की प्रक्रिया को समाप्त कर देगी। सिर्फ मामले में यहाँ जोड़ा गया। लेकिन वास्तव में मेरे विशेष मामले में कोई प्रभाव नहीं है। क्या इसकी आवश्यकता है, पर्यावरण पर निर्भर करता है ( shopt चेक करें )
> / dev / null - मूल रूप से अक्षम करने के लिए कुछ भी नहीं करने के लिए मानक आउटपुट को रीडायरेक्ट करें।
2> & 1 - रीडायरेक्ट स्टैंडर्ड एरर (2) आउटपुट टू स्टैण्डर्ड आउटपुट (1), जो कि null
& - detach to background को रीडायरेक्ट किया गया है, यह स्टैंडर्ड इनपुट को / dev / null को भी रीडायरेक्ट करेगा।

यह अनिवार्य रूप से डेबियन dpkg से स्टार्ट-स्टॉप-डेमॉन उपयोगिता है जो इसके मूल में है। यही कारण है कि मैं इस तरह से स्क्रिप्ट शुरू करना पसंद करता हूं, फिर अपने कोड में एक और बाहरी उपयोगिता कॉल शुरू करता हूं। स्टार्ट-स्टॉप-डेमोन उन मामलों में उपयोगी है, जहां आपके पास पूर्ण विकसित डेमॉन प्रोग्राम हैं जिन्हें आपको शुरू करने की आवश्यकता है और जहां आपको अतिरिक्त कार्यक्षमता की आवश्यकता होती है, जो स्टार्ट-स्टॉप-डेमॉन प्रदान करता है (उदाहरण के लिए जाँच कि यदि निर्दिष्ट प्रक्रिया पहले से चल रही है ताकि यह न हो 'इसे फिर से लॉन्च करें)।

यह भी ध्यान देने योग्य है कि आप अपनी प्रक्रिया के फ़ाइल डिस्क्रिप्टर को भी बंद कर सकते हैं बजाय उन्हें / dev / null के पुनर्निर्देशित करने के , उदाहरण के लिए:

su someuser -c "some_script.sh 0<&- 1>&- 2>&- &"

0 <& - मानक मानक इनपुट (0)
1> और - मानक मानक बंद करें (1)
2> और - मानक त्रुटि बंद करें (2) आउटपुट

<> संकेतों की दिशा में कोई फर्क नहीं पड़ता क्योंकि लंबे समय तक फाइल डिस्क्रिप्टर संख्या निर्दिष्ट है। तो यह भी उतना ही अच्छा है:

su someuser -c "some_script.sh 0>&- 1>&- 2>&- &"

या

su someuser -c "some_script.sh 0<&- 1<&- 2<&- &"

हालांकि, यह लिखने के लिए थोड़ा कम तरीका है कि, स्टड और स्टडआउट के लिए संख्या के बिना, दिशा कहाँ मायने रखती है:

su someuser -c "some_script.sh <&- >&- 2>&- &" 

जब फ़ाइल डिस्क्रिप्टर या तो बंद हो जाते हैं या / dev / null ( स्टार्ट-स्टॉप-डेमॉन रीडायरेक्ट / dev / null) कर रहे हैं, तो प्रक्रिया डेमन के रूप में बैकग्राउंड में चलने के लिए सुरक्षित है। ताकि बूट समय के दौरान स्क्रिप्ट लॉन्च करने के साथ समस्याओं ( शुरुआत ) से बचने के लिए आवश्यक हो ।

मैंने अपने प्रारंभिक विचार से पूरा समाधान लागू किया है और इसे GitHub पर रखा है:
https://github.com/ivankovacevic/userspaceServices


इवान, क्या सु या सुलोगिन का उपयोग करना बेहतर है? मैंने सु के आदमी को पढ़ा लेकिन मैं इस विशिष्ट मामले को नहीं समझ सकता।
मासिमो

1
@ मासीमो, मेरी प्रतिक्रिया में देरी के लिए खेद है! इस सवाल की जाँच करें: unix.stackexchange.com/questions/318572/… वहाँ एक बेहतर मैनुअल पेज है जो इसे समझा रहा है। मूल रूप से अंतर कार्य निर्देशिका और पर्यावरण चर की स्थापना में है। मैं इस तरह के मामलों का उपयोग करने के लिए कहूंगा (किसी अन्य उपयोगकर्ता के रूप में कुछ करना) यह वास्तव में उपयोग करने के लिए एक बेहतर विकल्प हो सकता है
इवान कोवासेविक

3

आप विकल्प के साथ init.d से स्टार्ट-स्टॉप-डेमॉन का उपयोग कर सकते हैं --user


मैंने मिस्टर शार्क के उत्तर पर स्टार्ट-स्टॉप-डेमॉन के बारे में टिप्पणी की है और मैंने अपने उत्तर और मेरे प्रश्न (अपडेट 4) के लिए एक अपडेट भी किया है
इवान कोवेसेविक

2

मैंने इसका पूरी तरह से परीक्षण नहीं किया है, लेकिन मुझे लगता है कि ऐसा कुछ:

/sbin/start-stop-daemon --background --start --exec /home/USER/.startUp --user USER --pidfile=/home/USER/.startUp.pid --make-pidfile

स्टार्टअप पर और फिर

/sbin/start-stop-daemon --stop --user USER --pidfile=/home/USER/.startUp.pid

जब बंद हो रहा है।

.SutDown स्क्रिप्ट को संभालना स्टार्टअप चीज जैसी किसी चीज द्वारा किया जा सकता है, लेकिन आप यह सुनिश्चित नहीं कर सकते कि स्क्रिप्ट बंद हो जाए क्योंकि शटडाउन वैसे भी होना चाहिए :-)

चाल करना चाहिए, शायद आपको कुछ इनपुट पुनर्निर्देशन में फेंक देना चाहिए, लेकिन फिर आपको लॉग फाइल भरे जाने के बारे में चिंता करनी होगी।


2
अनिवार्य रूप से, यह काम करेगा! स्टार्ट-स्टॉप-डेमॉन बूट या अन्यथा सफलतापूर्वक प्रक्रियाएं शुरू कर सकता है। मैंने इसका परीक्षण किया है। और यह हैंगिंग स्टार्टअप प्रक्रिया के साथ उस समस्या से भी छुटकारा दिलाता है। हालाँकि आप अपने आरंभिक कॉल में भी एक -चीड USER याद कर रहे हैं। इसके बिना, यह प्रक्रिया को मूल के रूप में लॉन्च करेगा। Pid फ़ाइल को संभवतः / var / run / को लिखा जाना चाहिए क्योंकि अन्यथा यह उपयोगकर्ताओं के होम डायरेक्टरी में रूट स्वामित्व वाली फ़ाइल उत्पन्न करता है। लेकिन, मेरे दिमाग में, जेनेरिक स्क्रिप्ट के लिए स्टार्ट-स्टॉप-डेमॉन लॉन्च करना थोड़ा कठिन लगता है। मेरे उत्तर की जाँच करें जहाँ मैंने विस्तृत करने की कोशिश की कि क्यों।
इवान कोवेसेविक

1

क्या आपने प्रयोग करने की कोशिश की है su?

su -c /home/user/.startUp/executable - user

-c कमांड को निष्पादित करने के लिए su बताता है, और अंतिम पैरामीटर उपयोगकर्ता को इसे निष्पादित करने के लिए है।


हां, वह काम करता है लेकिन कुछ उद्धरण और जोड़े गए एम्परसेंड के साथ। और मुझे यह लिखने के लिए क्लीनर मिल गया है: su <username> -c "/some/path/script.sh &" मूल रूप से मैंने sudo का उपयोग किया है क्योंकि यह क्लीनर लग रहा था, लेकिन अब यह बेहतर लगता है तब उपयोग कर रहा है: sudo - u <username> bash -c "/some/path/script.sh &"। पता नहीं कि उन दोनों में कोई अंतर है या नहीं
इवान कोवासेविक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.