टीएल; डीआर: का उपयोग करें sudo -bया, बेहतर ,।openvpn [...] --daemon
जब से आप चला रहे हैं openvpn(और, विशेष रूप से, जब से आप पृष्ठभूमि में रूट के रूप में एक प्रोग्राम चलाना चाहते हैं ), तो पृष्ठभूमि में कमांड चलाने के तरीके के बारे में सबसे अधिक जानकारी आपकी स्थिति को संबोधित नहीं करती है। तुमने कहा था:
मैंने cpenvpn कमांड में a & संलग्न करने की कोशिश की है और इसके सामने nohop रखने के लिए। दोनों काम नहीं करते।
आपकी आज्ञा है:
sudo openvpn ~/my_connection.ovpn
sudoडिफ़ॉल्ट कॉन्फ़िगरेशन के तहत , यदि आपने हाल ही sudoमें उसी संदर्भ के लिए अपना पासवर्ड दर्ज नहीं किया है (इंटरैक्टिव उपयोग के लिए, आमतौर पर इसका मतलब वही टर्मिनल है) तो यह आपके पासवर्ड के लिए पूछेगा। लेकिन अगर आप कमांड को बैकग्राउंड में चलाते हैं, &तो आपको लाइन नहीं दिखाई जाएगी या इसे टाइप करने का अवसर नहीं दिया जाएगा।[sudo] password for user:
तो इस स्थिति में, कमांड चलाना, अपना पासवर्ड दर्ज करना, और बाद में बैकग्राउंड में भेजना यह एक उचित तरीका है, इंटरैक्टिव उपयोग के लिए ।
लेकिन यह एकमात्र तरीका नहीं है और जैसा कि आप कहते हैं, आप एक स्क्रिप्ट में ऐसा नहीं करना चाहेंगे ।
रास्ता 1: सुनिश्चित करें कि sudoएक ताजा टाइमस्टैम्प है।
आप यह सुनिश्चित कर सकते हैं कि sudoवर्तमान टाइमस्टैम्प जब आपके कमांड को चलाने के लिए प्रयोग किया जाता है, तो पहले चलाकर:
sudo -v
उसके बाद, आप चला सकते हैं:
sudo openvpn ~/my_connection.ovpn &
हालाँकि, जब आप बैकग्राउंड में कमांड चलाना चाहते हैं तो आमतौर पर &(और nohup) पूरी तरह से बचना बेहतर होता है sudo। यह विशेष रूप से स्क्रिप्टिंग के मामले में है।
रास्ता 2: उपयोग करें sudo -b। सामान्य तौर पर, यह आमतौर पर आप क्या चाहते हैं।
इसके बजाय, आप sudoस्वयं को अग्रभूमि में चला सकते हैं , लेकिन -bध्वज को पास कर सकते हैं , जिससे sudoपृष्ठभूमि में कमांड को चलाया जा सकता है।
sudo -b openvpn ~/my_connection.ovpn
यह आमतौर पर एक बेहतर तरीका है, खासकर यदि आप एक स्क्रिप्ट में कमांड डाल रहे हैं। साथ sudo -bआप नहीं मिलता है काम पर नियंत्रण है, लेकिन एक खोल स्क्रिप्ट काम पर नियंत्रण में डिफ़ॉल्ट रूप से अक्षम है और आप आम तौर पर यह प्रयोग नहीं करना चाहिए ।
जैसा कि man sudoबताते हैं:
-b, --background
Run the given command in the background. Note that it is not
possible to use shell job control to manipulate background
processes started by sudo. Most interactive commands will
fail to work properly in background mode.
यह काम करता है क्योंकि पृष्ठभूमि में कुछ भी नहीं चल रहा है जब तक कि सूडो ने आपके पासवर्ड (यदि आवश्यक हो) को हटा दिया है और निर्धारित किया है कि आपको कमांड चलाने की अनुमति है।
रास्ता 3: लेकिन इसके लिए openvpn, आपको शायद इसे बस चलाना चाहिए --daemon।
openvpnयदि आप इसे --daemonविकल्प के साथ चलाते हैं, तो पृष्ठभूमि में स्वचालित रूप से चलेगा :
sudo openvpn ~/my_connection.ovpn --daemon
पहले के बजाय --daemonआपके .opvnफ़ाइल नाम के बाद पास ; निम्नलिखित तर्क --daemon, यदि कोई हो, के नाम के रूप में व्याख्या की जाती है जिसे डीमॉनेटाइज़्ड openvpnप्रक्रिया का उपयोग करना चाहिए। ( अपेंड भी न करें &।)
यह उचित है या नहीं यह इस बात पर निर्भर करता है कि openvpnचलने के बाद कोई बातचीत होनी चाहिए या नहीं, लेकिन इससे पहले कि यह निष्क्रिय हो जाए। और जो निर्भर करता है, भाग में, जो स्थापित किया गया है उस पर ~/my_connection.ovpn। लेकिन अगर openvpnतुरंत अवमानना नहीं कर सकता है, तो तुरंत पृष्ठभूमि में इसे चलाने के अन्य सभी तरीके टूट जाएंगे, भी ।
इसलिए, किसी भी स्थिति जहाँ आप जानते हैं आप चाहते हैं openvpnकरने के लिए शुरू पृष्ठभूमि में चल रहा है, और आप जानते हैं कि आप इसे अग्रभूमि में वापस लाना चाहते हैं नहीं होगा, तो आप दृढ़ता से साथ यह लागू करने की विधि पर विचार करना चाहिए --daemonविकल्प। यह विशिष्ट है - openvpnअंतिम कार्यक्रम एक --daemonविकल्प का समर्थन नहीं करते हैं , हालांकि कई सर्वर कार्यक्रमों में कुछ ऐसे विकल्प होते हैं। (नाम और वाक्य-विन्यास अलग-अलग होते हैं, हालांकि)
इस विकल्प का उपयोग करने या न करने का निर्णय लेने के लिए (और आप इसे कैसे उपयोग करना चाहते हैं), मैं आपको मैनुअल पेज को पढ़ने कीopenvpn सलाह देता हूं , विशेष रूप से अनुभाग में --daemon। इसकी बहुत सारी उपयोगी जानकारी है, और मैं केवल पहले पैराग्राफ को यहाँ उद्धृत कर रहा हूँ:
--daemon [progname]
Become a daemon after all initialization functions are
completed. This option will cause all message and error output
to be sent to the syslog file (such as /var/log/messages),
except for the output of scripts and ifconfig commands, which
will go to /dev/null unless otherwise redirected. The syslog
redirection occurs immediately at the point that --daemon is
parsed on the command line even though the daemonization point
occurs later. If one of the --log options is present, it will
supercede syslog redirection.
The optional progname parameter [...]
तरीका 4 : कभी-कभी पूरी स्क्रिप्ट को रूट के रूप में चलाना उचित है।
यदि आपके पास एक स्क्रिप्ट है जो कई क्रियाओं को जड़ के रूप में करती है, तो इसकी कोई महत्वपूर्ण गतिविधि नहीं है, जो यथोचित रूप से रूट के रूप में नहीं चलेगी , और स्क्रिप्ट को गैर-रूट उपयोगकर्ता के रूप में चलाने के लिए उपयोगी कुछ भी नहीं है, फिर स्क्रिप्ट के उपयोगकर्ता को संभवतः इसे रूट के रूप में चलाना चाहिए।
यदि यह मामला है, तो आपको sudoस्क्रिप्ट में कमांड से हटा देना चाहिए । जब स्क्रिप्ट रूट के रूप में चलती है, तो इसकी कोई आवश्यकता नहीं है sudo। (हालांकि जड़ उपयोगकर्ता कर सकते हैं, डिफ़ॉल्ट रूप से, किसी भी उपयोगकर्ता के रूप में किसी भी आदेश के साथ ही सहित चलाने sudoऔर ऐसा करने के लिए एक पासवर्ड की जरूरत नहीं है। तो अगर आप कर की छुट्टी उदाहरणों sudoलिपि में तो यह होगा शायद अभी भी काम करते हैं।)
यदि आपके पास sudoस्क्रिप्ट में कोई उदाहरण है जो वास्तव में रूट (के साथ ) के बजाय कुछ अन्य उपयोगकर्ता के रूप में कमांड चलाने के लिए उपयोग किया जाता है , तो आपको अभी भी उन उदाहरणों को रखना चाहिए ।-u user
यदि पूरी स्क्रिप्ट को रूट के रूप में चलाया जा रहा है, तो पृष्ठभूमि में चलने वाले कमांड बनाने के अधिकांश विशिष्ट तरीके लागू होते हैं, जिसमें &आवश्यकता होती है, और जहां आवश्यक हो, nohup(जिसके बारे में आप पहले से जानते हैं) का उपयोग करें। हालांकि, इसके लिए, आपको अभी भी विकल्प के openvpnसाथ दृढ़ता से विचार करना चाहिए --daemon।