क्रोन से एक स्क्रिप्ट का निष्पादन


12

मेरे पास एक परीक्षण है। एस स्क्रिप्ट

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

जब मैं फ़ाइल को कमांड लाइन से रूट के रूप में निष्पादित करता हूं तो यह काम करता है।

sh /home/v/test.sh 

जब मैंने इसे crontab -e (रूट क्रोन) पर सेट किया है, काम नहीं कर रहा है

 * * * * * sh /home/v/test.sh

मुझसे क्या गलती हुई है? धन्यवाद


"काम नहीं कर रहा है" काम नहीं कर रहा है। देख? आप नहीं जानते कि मेरा क्या मतलब है, और इसी तरह हम नहीं जानते कि आपका क्या मतलब है। मेरा मतलब है (हां) क्या काम नहीं कर रहा है? कुछ भी हो सकता है। Tmow का अनुमान सही हो सकता है, लेकिन यह केवल एक अनुमान है (और मुझे लगता है कि बहुत अच्छा है, लेकिन अभी भी)।
जर्गेन ए। एरहार्ड

हां, यदि आप अधिक विशिष्ट हो सकते हैं कि आप क्या परिणाम देख रहे हैं, तो हम यह निर्धारित करने में बेहतर होंगे कि समस्या क्या है। यानी, आपका क्या मतलब है "काम नहीं करना" (:
gabe। 16

मैं किसी भी लॉग इन नहीं देख रहा हूँ, और स्क्रिप्ट कुछ db में आवेषण कर रहे हैं जो नहीं हो रहा है, और वे खुश हैं अगर मैं स्क्रिप्ट को हाथ से चलाऊं।
एलजो वलूगी

जवाबों:


15

आदमी के अनुसार:

क्रोन डेमॉन आपके होम निर्देशिका से एक उपखंड शुरू करता है। यदि आप लॉग इन नहीं होने पर चलाने के लिए एक कमांड शेड्यूल करते हैं और आप अपनी .profile फ़ाइल में कमांड चलाना चाहते हैं, तो कमांड को आपकी .profile फ़ाइल को स्पष्ट रूप से पढ़ना चाहिए।

क्रोन डेमॉन हर शेल के लिए एक डिफ़ॉल्ट वातावरण की आपूर्ति करता है, गृह, लॉगनेम, शेल (= / usr / बिन / श),
और पथ (= / usr / बिन) को परिभाषित करता है ।

इसलिए क्रोन डेमन को नहीं पता कि php कहां है और आपको पूर्ण php पथ को हाथ से निर्दिष्ट करना चाहिए, उदाहरण के लिए (मुझे आपके वास्तविक PHP पथ का पता नहीं है):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

एक अन्य तरीका उदाहरण के लिए / etc / profile (या आपकी .profile / .bashrc) को स्रोत बनाने के लिए है

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

यह उपयोगी है यदि आपका .bashrc पर्यावरण चर सेट करता है जिसकी आपको आवश्यकता है (यानी PATH)

संपादित करें

एक दिलचस्प रीडिंग " न्यूबी: इंट्रो टू क्रोन " है, शीर्षक से लेख का मूल्यांकन न करें (यह हर किसी के लिए एक रीडिंग है), वास्तव में यह अच्छी तरह से पूरा लिखा गया है और आपके प्रश्न का पूरी तरह से उत्तर देता है:

...
PATH में वे निर्देशिकाएँ होती हैं जो क्रोन के लिए खोज पथ में होंगी जैसे कि यदि आपको निर्देशिका / usr / cog / bin में कोई प्रोग्राम 'foo' मिला है, तो यह / usr / cog / bin को जोड़ने लायक हो सकता है। पथ, क्योंकि यह आपको 'फू' के लिए पूर्ण पथ का उपयोग करने से रोक देगा, जब भी आप इसे कॉल करना चाहते हैं।
...


खराब $ PATH स्क्रिप्ट का सबसे आम कारण है जो हाथ से काम करता है, लेकिन क्रोन से नहीं।
पैट्रिक

@ निश्चित रूप से यह एक समस्या है अगर क्रोन को पता नहीं है कि कहां php है, अन्यथा एल्ज़ो कोंट्राब बिना किसी मुद्दे के काम करेगा, यह एक पथ समस्या होना चाहिए।
tmow

आपके उत्तर के लिए बहूत बहूत धन्यवाद। इसने मेरे लिए बहुत आसानी से काम किया !!! .. बहुत बहुत धन्यवाद @tmow।
विग्नेश प्रजापति 18

5

कमांड में काम करते समय कमांड के चार सामान्य कारण हैं, लेकिन सामान्यता के क्रम में क्रोन से नहीं, बल्कि:

  1. क्रोन एक सीमित वातावरण प्रदान करता है, जैसे, एक न्यूनतम $PATH, और अन्य अपेक्षित चर गायब।
  2. क्रोन डिफ़ॉल्ट रूप से आक्रमण / बिन / श करता है, जबकि आप कुछ अन्य शेल का अंतःक्रियात्मक रूप से उपयोग कर सकते हैं।
  3. क्रोन% चरित्र को विशेष रूप से मानते हैं (यह कमांड में एक नई रेखा में बदल जाता है)।
  4. क्रोन एक टर्मिनल या ग्राफिकल वातावरण प्रदान नहीं करता है।

यदि आपकी नौकरी त्रुटि संदेश सहित किसी भी आउटपुट का उत्पादन करती है, तो क्रोन आपको पूरे आउटपुट के साथ एक ईमेल भेजता है। सुनिश्चित करें कि आप स्थानीय रूप से प्राप्त मेल को पढ़ते हैं या अपने द्वारा पढ़े गए पते पर अग्रेषित करते हैं। किसी स्थानीय खाते से किसी अन्य पते पर मेल अग्रेषित करने के लिए, दूसरा पता अंदर डालें ~/.forward। यदि क्रोन जॉब एक ​​सिस्टम उपयोगकर्ता ( root, webmaster…,) के रूप में चल रहा है , तो सुनिश्चित करें कि उपयोगकर्ता का मेल आपको (और किसी भी अन्य व्यवस्थापक को) रीडायरेक्ट किया गया है; अधिकांश मेल सेटअपों के साथ, लाइन्स को root: elzoअंदर रखें /etc/aliases


2

क्रोन डेमॉन आमतौर पर एक शेल में आपकी कमांड को निष्पादित करता है जहां PATH पर्यावरण चर कुछ सिस्टम डिफ़ॉल्ट, जैसे / usr / bin: / bin तक सीमित है।

संभवतः, आपकी phpकमांड / usr / bin या / bin में उपलब्ध नहीं है और इस प्रकार स्क्रिप्ट विफल हो जाती है जब क्रोन के माध्यम से निष्पादित किया जाता है और इस तरह सफल नहीं होता है।

क्रोन आमतौर पर रूट उपयोगकर्ता को एक मेल के माध्यम से त्रुटियों या नौकरी के संदेशों की रिपोर्ट करता है (यानी जब कोई कमांड एक निकास स्थिति लौटाता है! = 0 या नौकरी समाप्त होने के बाद stdout / stderr को आउटपुट देता है)।

आपके सिस्टम के आधार पर आपको इन संदेशों को प्राप्त करने के लिए स्थानीय मेल डिलीवरी सेटअप करना होगा।

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