मैं मौजूदा पर्यावरण चर के साथ क्रोन कमांड कैसे चला सकता हूं?


114

मैं मौजूदा पर्यावरण चर के साथ क्रोन कमांड कैसे चला सकता हूं?

यदि मैं एक शेल प्रॉम्प्ट पर हूं, तो मैं टाइप कर सकता हूं echo $ORACLE_HOMEऔर एक पथ प्राप्त कर सकता हूं । यह मेरे पर्यावरण चर में से एक है जो मेरे में सेट हो जाता है ~/.profile। हालाँकि, ऐसा लगता है कि ~/.profileलोडेड फ्रोन क्रोन स्क्रिप्ट नहीं मिलती है और इसलिए मेरी स्क्रिप्ट विफल हो जाती है क्योंकि $ORACLE_HOMEचर सेट नहीं होता है।

में इस सवाल का लेखक एक बनाने का उल्लेख ~/.cronfileप्रोफ़ाइल जो क्रॉन के लिए चर सेट, और फिर वह अपने सभी क्रॉन आदेशों लिपियों में वह अपने में रहता है लोड करने के लिए एक समाधान करता है ~/Cronनिर्देशिका। एक फ़ाइल की ~/.cronfileतरह एक अच्छा विचार लगता है, लेकिन बाकी का जवाब थोड़ा बोझिल लगता है और मुझे उम्मीद थी कि कोई मुझे एक ही परिणाम प्राप्त करने का एक आसान तरीका बता सकता है।

मुझे लगता है कि मैं अपनी स्क्रिप्ट की शुरुआत में ऐसा कुछ जोड़ सकता हूं, source ~/.profileलेकिन ऐसा लगता है कि यह बेमानी हो सकता है।

तो मैं अपनी क्रोन लिपियों को अपने इंटरेक्टिव-शेल प्रोफाइल से चर को कैसे लोड कर सकता हूं?


कैसे source ~/.profileएक कार्यक्रम के लिए जोड़ रहा है बेमानी? कार्यक्रम कॉलिंग प्रोग्राम से अपने पर्यावरण को विरासत में लेते हैं। यदि वह कॉलिंग प्रोग्राम आपका शेल नहीं है, तो डिसेन्डर प्रोग्राम को वह वातावरण कैसे मिलेगा जो आप चाहते हैं?
5

मैंने पहले से ही यहाँ एक ऐसे ही प्रश्न का उत्तर लिखा है। यह बस su -lरूट या अन्य विशिष्ट उपयोगकर्ता के लिए $ PATH सहित एक सामान्य लॉगिन वातावरण को सेटअप करने के लिए उपयोग करता है।
टास्क

जवाबों:


141

Crontab में, कमांड करने से पहले, जोड़ें . $HOME/.profile। उदाहरण के लिए:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

Cronअपने खोल के बारे में कुछ नहीं जानता; यह सिस्टम द्वारा शुरू किया गया है, इसलिए इसका न्यूनतम वातावरण है। यदि आप कुछ भी चाहते हैं, तो आपको उस चीज़ को खुद में लाना होगा।


14
.स्क्रिप्ट से पहले क्या करता है? (मुझे यकीन नहीं है कि मैं कैसे होगा man)। यह अलग क्यों है source?
cwd

25
.आदेश के लिए मूल आदेश है source। वे खोल के भीतर समतुल्य हैं और टाइप करना थोड़ा आसान है, विशेषकर क्रॉस्टैब के भीतर। अधिक जानकारी प्राप्त करने के लिए, टाइप करें help .या zshbuiltins प्रकार के शीर्ष पर ^SHELL BUILTIN COMMANDSपुरुष पृष्ठ bashमें man खोजें । ` . Running आपको बताएंगे कि कमांड एक बिल्डिन है।
अरेज

9
लिनक्स वितरण के आधार पर, आपको बदलने की आवश्यकता हो सकती .profileहै .bash_profile। जाँचें कि कौन सी .profileफ़ाइल उपयोगकर्ता के होम डायरेक्टरी में मौजूद है।
फ्रॉस्टी जेड

@ ऐसर्ज यह मेरे लिए काम नहीं करता (फेडोरा कोर 21), और मुझे लगता है कि क्योंकि शेल स्तर वापस नीचे गिरता है। इसके बजाय, यदि आप इसका स्रोत करते हैं तो क्या काम करता है।
रिचर्ड टी

3
यह संभावना है कि यदि यह काम नहीं कर रहा है, तो यह इसलिए है क्योंकि क्रोन स्क्रिप्ट के लिए शेल सेट करने के लिए सेट नहीं है, इसलिए यह उसी तरह निष्पादित नहीं कर रहा है जिस तरह से आप उम्मीद कर सकते हैं।
डैनियल फैरेल

40

एक अन्य विकल्प, जो मुझे आसान लगता है, वह है स्क्रिप्ट को क्रोन के साथ चलाना और स्क्रिप्ट में पर्यावरण।

Crontab -e फ़ाइल में:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh

Cron_job.sh फ़ाइल में:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

.Bash_profile के स्रोत के बाद की कोई भी कमांड आपके वातावरण को मान जाएगी जैसे आपने लॉग इन किया है।


5
जब एक एडब्ल्यूएस लिनक्स एएमआई पर चल रहा है, तो यह मेरे लिए भी नहीं हुआ कि क्रॉन /bin/bashशेल के रूप में उपयोग नहीं किया जाएगा । मैं सोचता रहा कि cd /path/to/project; source .varsजब मैं उन्हें मैन्युअल रूप से टाइप करता हूं , तो वे काम क्यों करेंगे, लेकिन File not foundक्रोनजोब में शामिल होने पर वे असफल हो जाएंगे ( )। मेरे लिए मुख्य पंक्ति यह थी SHELL=/bin/bashकि मैं वास्तव में प्रत्येक क्रोनजॉब में परिचित बैश कमांड का उपयोग कर सकूं। /bin/sh/(डिफ़ॉल्ट क्रोन खोल, जाहिरा तौर पर) बहुत सीमित है।
हार्टले ब्रॉडी

यह बहुत बुरा है कि आप क्रोन के शीर्ष पर पर्यावरण फाइलें निर्दिष्ट नहीं कर सकते हैं जैसे कि आप व्यक्तिगत पर्यावरण चर को निर्दिष्ट कर सकते हैं। Systemd की एक EnvironmentFileसेवा इकाई है। बहुत बुरा क्रोन कुछ समान नहीं है।
राडेक

आप सभी लिपियों में बिन / बैश का उपयोग करने के लिए सभी लिपियों को बल देते हैं, जो कि एक अच्छा विचार नहीं है, यह भी कि आपकी क्रोन लाइन के बारे में क्या है: * / 1 * * * * $ HOME / cron_job.sh… * / 1 WHAT के लिए अच्छा है ?!? एक स्टार का मतलब है कि इसे हर मिनट / 1 मतलब हर मिनट में अंजाम दिया जाएगा, एक स्मार्ट समुदाय में एक जवाब के रूप में यह एक बुरा पाप है, अब मुझे विश्वास है कि आप सबसे अच्छा कहने के लिए बहुत उलझन में हैं ... खेद है
THESorcerer

1
इसे ही उदाहरण कहा जाता है। अपनी आवश्यकताओं के अनुरूप समायोजित करने के लिए स्वतंत्र महसूस करें या इसका उपयोग बिल्कुल न करें। अलग - अलग लोगों के लिए अलग स्ट्रोक्स।
रॉबर्ट ब्रिसिटा

4
यदि $SHELLहै /bin/sh, तो sourceकमांड मौजूद नहीं है। .इसके बजाय उपयोग करें ।
मेले

18

एक अन्य विकल्प, जो मुझे आसान लगता है, वह है स्क्रिप्ट को क्रोन के साथ चलाना और बैश को लॉगिन करना (इसलिए /etc/profile.d/...पर्यावरण परिभाषाओं का उपयोग करके )

में crontab -eफ़ाइल:

*/1 * * * * bash -l -c './cron_job.sh'
*/1 * * * * bash -l -c 'php -f ./cron_job.php'

स्रोत के बाद कोई भी आदेश .bash_profileआपके पर्यावरण का होगा जैसे आपने लॉग इन किया था।


10

बुरा विचार। सामान्य अभ्यास विशेष रूप से एक स्क्रिप्ट में सभी आवश्यक पर्यावरणीय चर सेट करना है जो कि क्रॉन जॉब से चलाया जाना है।


मैं @fpmurphy से सहमत हूं, इस तरह से यह सुरक्षित प्रक्रिया वातावरण को भी सुनिश्चित करता है। यदि आप क्रोन से केवल कुछ चर सेट करना चाहते हैं तो आप चर /usr/bin/envसेट करने के लिए कमांड का उपयोग कर सकते हैं और फिर क्रोनजोब के लिए पर्यावरण प्रक्रिया के रूप में कार्य कर सकते हैं।
निखिल मुल्ले

डेमोंटोसुल्स केenvdir दिमाग में भी आता है।
sr_

6
मैं सभी सुरक्षा के लिए हूं, लेकिन शायद मैं एक फाइल बना सकता हूं ~/.cronvarsऔर उस प्रोफाइल में और मेरी क्रोन लिपियों में भी शामिल कर सकता हूं। मैं अपने द्वारा चलाए जाने वाली प्रत्येक स्क्रिप्ट में हार्ड कोड पर्यावरण चर नहीं चाहता, क्योंकि जब पथ बदलते हैं तो प्रत्येक फ़ाइल में हार्ड कोडित पथ बनाए रखना आसान नहीं होता है। ऐसा लगता है कि आवश्यक चर के लिए एक केंद्रीकृत जगह की अनुमति देगा और अभी भी अन्य चर को लोड होने से बचाए रखेगा।
cwd

4

यह वाक्य रचना निश्चित रूप से आपकी मदद करती है। मैं वाक्य रचना को नहीं समझता, लेकिन यह काम करता है। ओरेकल इस सिंटैक्स का उपयोग करता है, जब ओरेकल कॉन्फ़िगरेशन मैनेजर को कोंट्राब में तैनात करता है, इसलिए, मेरा मानना ​​है कि यह एक सही समाधान है।

0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters

2

मैं हाल ही में एक ऐसे मामले में आया था जिसमें मुझे समग्र क्रोनजोब को रूट के रूप में निष्पादित करना था लेकिन, एक ही समय में, एक उपयोक्ता को एक अलग उपयोगकर्ता के रूप में निष्पादित करना था (जिसमें उस उपयोगकर्ता के वातावरण की सोर्सिंग आवश्यक थी)। मैं निम्नलिखित दृष्टिकोण के साथ गया:

# m  h  dom  mon  dow  user  command
*/5  *   *    *    *   root  (sudo -i -u <the user> command-to-be-run-as-user) && command-to-be-run-as-root

महत्वपूर्ण भाग वह तर्क -iहै जिसे पारित किया जा रहा है sudoजो एक अलग लॉगिन शेल में दिए गए कमांड को निष्पादित करेगा (जिसका बदले में मतलब है कि उपयोगकर्ता के डॉटफ़ाइल्स को सॉर्ट किया जाएगा)।

पुनश्च: ध्यान दें कि userकॉलम केवल /etc/crontabऔर /etc/cron.d/*फाइलों में उपलब्ध है ।


1

समाधान, जो मेरे लिए काम करता है, यहां वर्णित है

आप एक रैपर स्क्रिप्ट बनाते हैं, जो कॉल करता है . ~/.cronfile, और फिर वह चीजें करता है जो आप चाहते हैं। यह लिपि क्रोन द्वारा लॉन्च की गई है।

में ~/.cronfileआप अपने क्रॉन नौकरियों के लिए पर्यावरण को निर्दिष्ट करें।


1

हां, आप "जाने-माने वर्कअराउंड" (जिनमें से कुछ सूचीबद्ध किए गए हैं) का उपयोग कर सकते हैं। यह कहने का एक और तरीका है कि हर कोई जानता है कि यह भद्दा है, हालांकि कुछ लोग इसे "सुरक्षा सुविधा" के रूप में संदर्भित करेंगे क्योंकि उन्होंने कम से कम इस असफलता (ure) पर ट्रिपिंग के रूप में आपके पास जितना खर्च किया है, और उनके बारे में सोचना चाहेंगे समय बर्बाद नहीं हुआ था। यह QWERTY कीबोर्ड के बराबर क्रोन है।

मुझे संदेह है कि मूल कारण प्रदर्शन के लिए हो सकता है, जैसे कि स्क्रिप्ट एक मिनट चलने के बाद आरसी स्क्रिप्ट पढ़ने के लिए समय नहीं बिताएगी। मूल रूप से क्रोन वास्तव में बिल्कुल भी कॉन्फ़िगर करने योग्य नहीं था, इसलिए एक डिफ़ॉल्ट वास्तव में एकमात्र विकल्प था।

कुछ सरल कॉन्फ़िगरेशन या क्रोन नहीं होने से कोई अतिरिक्त सुरक्षा नहीं है, उपयोगकर्ताओं को बेवकूफ खोल जिम्नास्टिक प्रदर्शन करने के बजाय क्रोन को आपके इंटरेक्टिव शेल के वातावरण पर ले जाना है। एक आधुनिक मशीन पर आम तौर पर कोई बोधगम्य प्रदर्शन लाभ नहीं होता है जब तक कि आपके पास हर मिनट चलने वाली नौकरियों की एक बड़ी मात्रा न हो।

यूनिक्स संस्कृति विफल। मेरी विनम्र राय में। :-)


1
"कोई अतिरिक्त सुरक्षा नहीं है।" वह सत्य नहीं है। CVE-2011-1095 , CVE-2008-4304 , और CVE-2010-3847 पर एक नज़र डालें

मैंने आपके जवाब को दरकिनार कर दिया। मैं आमतौर पर नवागंतुकों के जवाबों से बचने की कोशिश करता हूं, लेकिन मेरे लिए सुरक्षा महत्वपूर्ण है। कृपया गलत तरीका न अपनाएं। सुरक्षा के बारे में भाग के अलावा, आपका उत्तर उत्कृष्ट है और एक उत्थान के लायक होगा। यदि आप चाहें तो आप यहां अपना उत्तर संपादित कर सकते हैं।

उन में से कोई भी मामूली बात नहीं है कि क्रोन का उपयोग इंटरैक्टिव फ्लैग सेट के साथ एक शेल का उपयोग करना है। यह शुद्ध FUD है। दुर्भाग्य से मैं आपके पतन को कम नहीं कर सकता। यह एक लौ की तरह लग सकता है, लेकिन यह बहुत निराशाजनक है जब लोग सोचते हैं कि तीन पहियों वाला एक वाहन बेहतर है क्योंकि एक चौथा पहिया लगाने के लिए एक सुरक्षा मुद्दा है। यह नहीं है। लोगों ने अभी तक एक तिपहिया साइकिल की सवारी की है ताकि वे भूल गए कि एक चौथा पहिया जोड़ना संभव है।
ऑस्टिन एस।

एक और तरीका रखो: यदि किसी भी अतिरिक्त अतिरिक्त हुप्स का सुझाव दिया गया अन्य उत्तरदाताओं का उपयोग किया जाता है, तो वे आपके द्वारा उल्लिखित किसी भी छेद तक पहुंच प्राप्त नहीं करते हैं? "* * * * * bash -i -c LOCALE = ......."
ऑस्टिन एस।

यह एक शेख़ी की तरह पढ़ता है। मैं यह भी नहीं देखता कि यह सवाल का जवाब कहाँ देता है। यहां तक ​​कि अगर सुरक्षा भाग को हटा दिया गया था, @EvanTeitelman, मैं नहीं देखता कि यह एक उत्थान के लायक क्यों होगा क्योंकि यह प्रश्न का उत्तर नहीं देता है।
वाइल्डकार्ड


1

प्रोफ़ाइल सेट करने के बजाय, मुझे सेट करने में क्या मदद मिली PATH। मेरे क्रोन स्क्रिप्ट में कुछ कमांड उपलब्ध नहीं थे क्योंकि PATHयह अलग है।

ENVIRONMENT=prod
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
*/30 * * * * /opt/myscript1.sh
*/30 * * * * /opt/myscript2.sh
*/30 * * * * /opt/myscript3.sh

PATHआज्ञाओं के मार्ग के साथ स्थापित करने से मुझे मदद मिली। इससे भी बेहतर अगर आप एक टेम्पलेट का उपयोग कर सकते हैं और बाद में अलग कर सकते हैं,

ENVIRONMENT={{ENVIRONMENT}}
PATH={{PATH}}
*/30 * * * * /opt/myscript1.sh
*/30 * * * * /opt/myscript2.sh
*/30 * * * * /opt/myscript3.sh

प्रत्येक आइटम के लिए चर पासिंग गन्दा लगता है।


-1

मैंने डाला । ~/.dbus/session-bus/*मेरी इच्छित स्क्रिप्ट के शीर्ष पर :)


1
U & L SE में आपका स्वागत है। कृपया अपने उत्तर का और अधिक विस्तार करें ताकि इससे पाठकों को लाभ हो।
रमेश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.