2009-04-23 15 views
5

मेरे पास एक पर्ल स्क्रिप्ट है (XMLTV "हथियारों" के परिवार, विशेष रूप से tv_grab_oztivo) का हिस्सा है।मेरी कमांड लाइन क्रॉन से क्यों नहीं चलती है?

मैं सफलतापूर्वक इसे इस तरह चला सकते हैं:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

मैं सब कुछ करने के लिए पूर्ण पथ का उपयोग कार्य निर्देशिका के साथ मुद्दों को खत्म करने के लिए। अनुमतियाँ एक समस्या नहीं होनी चाहिए।

तो, अगर मैं इसे टर्मिनल (मैक ओएसएक्स) से चलाता हूं तो यह ठीक काम करता है।

लेकिन जब मैं इसे क्रॉन नौकरी के माध्यम से चलाने के लिए सेट करता हूं, तो कुछ भी नहीं होता है। कोई आउटपुट नहीं बनाया गया है।

जहां तक ​​मैं देख सकता हूं क्रॉन्टाब के साथ कुछ भी गलत नहीं है, क्योंकि अगर मैं वास्तविक लिपि के लिए helloworld.pl को प्रतिस्थापित करता हूं, तो यह सही समय पर ठीक चलता है।

तो, मैं डीबग करने के लिए क्या कर सकता हूं? मैं दो मामलों में %ENV को देखकर देख सकता हूं कि पर्यावरण बहुत अलग है, लेकिन मैं डिबगिंग के लिए अन्य दृष्टिकोण कैसे ले सकता हूं? मैं क्रॉन नौकरी के आउटपुट को कैसे देख सकता हूं, जो किसी प्रकार का पर्ल "मर" संदेश या खोल से "नहीं मिला" संदेश हो सकता है या जो भी हो?

या क्या मुझे किसी भी तरह से उसी माहौल के क्रॉन संस्करण को देने की कोशिश करनी चाहिए जब यह मेरे जैसा चल रहा हो?

उत्तर

8

यह अक्सर क्योंकि आप पूर्ण वातावरण जब क्रॉन के तहत चल नहीं मिलता है। बेस्ट शर्त कमांड का उपयोग करके ouput कब्जा करने के लिए है:

(/sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 

और फिर /tmp/qq पर एक नजर है।

यदि यह स्पष्ट हो बारी एक लापता वातावरण होने के लिए है, तो आप डाल करने के लिए आवश्यकता हो सकती है:

. ~/.profile 

या जैसे कुछ इसी तरह, अपने क्रॉन जॉब के निष्पादन श्रृंखला में,:

(. ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 
+0

यह काम कर रहा है। धन्यवाद। अंत में मैंने केवल PERL5LIB और PATH को $ ENV में जोड़ा और सभी ठीक थे। – AmbroseChapel

-1

cron आमतौर पर crontab मालिक को stdout और stderr और ई-mailes किसी भी उत्पादन के उत्पादन में कैप्चर करता है।

क्या आपने यह सुनिश्चित करने के लिए अपनी crontab प्रविष्टि को दो बार जांच लिया है कि यह सही है और सही समय पर निष्पादित होगा?

सुनिश्चित करें कि स्क्रिप्ट को किसी भी पर्यावरण चर सेट की आवश्यकता नहीं है। अन्यथा इसे किसी अन्य (बैश) स्क्रिप्ट में लपेटें, जहां आप पर्यावरण चर को सेट कर सकते हैं जिसे अन्य स्क्रिप्ट की अपेक्षा है।

+0

"क्या आपने यह सुनिश्चित करने के लिए अपनी क्रॉन्टाब प्रविष्टि को दोबारा जांच लिया है कि यह सही है और सही समय पर निष्पादित होगा?" -- हाँ। मैंने ऐसा कहा। – AmbroseChapel

+0

कोई बात नहीं, मैं सिर्फ दो बार जांचना चाहता था। क्रोंटैब सिंटैक्स मुश्किल है और इसे गलत करना आसान है। – lothar

+0

यदि आपको क्रॉन आउटपुट आपको मेल नहीं मिला है, तो आप आउटपुट के लिए जाने वाले परिवर्तन को बदलने के लिए अपने क्रॉन्टाब के शीर्ष में [email protected] का उपयोग कर सकते हैं। बस सुनिश्चित करें कि आपका स्थानीय मेलर काम करता है। – preaction

3

यदि आप दो मामलों में% ENV देख रहे हैं, तो मैं सुझाव दूंगा कि, अपनी पर्ल स्क्रिप्ट में पहले चरण के रूप में, क्रॉन जॉब में जो भी है, उसे% ENV सेट करें, और उसके बाद इसे चलाने की कोशिश करें कमांड लाइन।

BEGIN { 
    if (exists $ENV{something_in_your_env_not_in_cron}) { 
    %ENV = (...); 
    exec $^X, $0, @ARGV; 
    } 
} 

अब यह चलाने की कोशिश करें, और देख क्या आप इसे (पर्ल -d के तहत चल यदि आवश्यक सहित) डिबग करने के लिए क्या कर सकते हैं यदि: आप एक बार अपने आप को exec को यह पूरा नियंत्रण ले के लिए पड़ सकता है।सबसे अधिक संभावना है कि आप पाएंगे कि जब तक यह जादुई रूप से काम करना शुरू नहीं करता है तब तक आइटम% ENV में वापस जोड़ना समाप्त हो जाता है (LD_LIBRARY_PATH इसके लिए एक अच्छा है, लेकिन ओरेकल या डीबी 2 ऐप्स के लिए ORACLE_HOME या DB2HOME भी अच्छे विकल्प हो सकते हैं)। फिर आप या तो अपनी स्क्रिप्ट में या crontab में चर सेट कर सकते हैं।

+1

इसके साथ आपकी मदद के लिए धन्यवाद, आप वास्तव में मेरी सहायता करने में पैक्स के बराबर हैं लेकिन मैं केवल एक सही उत्तर दे सकता हूं, क्षमा करें। – AmbroseChapel

0

मैं cron कमांड से पूर्ण पथ द्वारा एक सरल खोल स्क्रिप्ट चलाऊंगा। उस स्क्रिप्ट के अंदर, मैं यह सुनिश्चित करता हूं कि मैंने एक ज्ञात (या जानकार) फ़ाइल में stdout और stderr फंस लिया। मैं यह भी सुनिश्चित करता हूं कि आपका पर्याप्त वातावरण सेट हो। यूनिक्स पर, जब आप क्रॉन के माध्यम से कमांड चलाते हैं तो आपको लगभग कोई पर्यावरण सेट नहीं मिलता है - मुझे मैकोज़ एक्स के बारे में निश्चित नहीं है। समस्याओं के लिए मानक अपराधी पथ है। मेरे पास एक अलग .cronfile है जो मेरे कामकाजी माहौल को पर्याप्त रूप से सेट करता है कि मुझे आमतौर पर समस्या नहीं होती - यह .profile का एनालॉग है।

0

अवसर पर यदि आप यह नहीं समझ सकते कि आपकी कमांड लाइन में क्या गलत हो रहा है, तो इसे ठीक करने का सबसे आसान तरीका पूरी चीज को शेल स्क्रिप्ट में बदलना है। आदर्श रूप से आपको यह करने के लिए नहीं होना चाहिए, लेकिन यह समस्या को हल करने का सबसे तेज़ तरीका हो सकता है।

फ़ाइल: /files/cron1.sh

#!/bin/sh 
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

और फिर क्रॉन में:

/files/cron1.sh 

यह आप स्क्रिप्ट क्रॉन के स्वतंत्र परीक्षण करने के लिए अनुमति देता है। याद रखें कि आपका लॉगिन खोल क्रॉन की तुलना में विभिन्न पर्यावरण चर के साथ चलता है।

संबंधित मुद्दे