Crontab में $ RANDOM के साथ समस्या


8

मुझे क्रोन में $ RANDOM के साथ एक अजीब समस्या है। मैं क्रोनजोब की आग के बाद एक कमांड को एक यादृच्छिक संख्या में निष्पादित करना चाहता हूं।

यह उदाहरण टर्मिनल में सीधे काम करता है और 30 सेकंड तक कमांड को विलंबित करता है (जो भी आप चाहते हैं उसके साथ कमांड को बदलें, यह वास्तव में एक गूंज है / dev / ttyUSB0):

sleep `expr $RANDOM \% 30` ; command

यदि एक ही लाइन को क्रॉस्टैब में रखा जाता है, तो कमांड हमेशा बिना देरी के तुरंत फायर करती है:

* * * * * sleep `expr $RANDOM \% 30` ; command

अगर मैं $ RANDOM के बिना एक अभिव्यक्ति का उपयोग करता हूं, तो यह ठीक काम करता है - यह 15 सेकंड की देरी करता है:

* * * * * sleep `expr 10 + 5` ; command

दूसरे शब्दों में, ऐसा लगता है कि $ RANDOM एक क्रोन में काम नहीं करता है।

लेकिन यह केवल इसलिए नहीं है क्योंकि $ RANDOM खुद शून्य का मूल्यांकन करता है, क्योंकि तब इसमें 10 की देरी होनी चाहिए:

* * * * * sleep `expr $RANDOM \% 30 + 10` ; command

मैंने & amp; के साथ भी प्रयास किया है के बजाय ; लेकिन वह मदद नहीं करता है। वास्तव में, फिर कमांड बिल्कुल भी फायर नहीं करता है!

मैं निश्चित रूप से एक स्क्रिप्ट में देरी को जगह दे सकता हूं, जिसे तब क्रॉस्टैब से बुलाया जाता है, लेकिन यह मेरी समस्या को नहीं समझाता है और मुझे परेशान नहीं करता है :-)

यह डेबियन लेनी है अगर इससे कोई फर्क पड़ता है।

जवाबों:


15

cron का उपयोग करता है /bin/sh कार्यों को निष्पादित करने के लिए शेल। कुछ विकृतियों में, यह एक सहानुभूति है dash। दोनों में से कोई भी समर्थन नहीं करता है $RANDOM चर, जो एक है bash -विशिष्ट विस्तार

  • विक्सी-क्रोन के साथ, आप एक पंक्ति डाल सकते हैं SHELL=/bin/bash अपने crontab के शीर्ष पर।

  • अन्यथा, आप के साथ समझौता करना होगा bash -c 'echo $RANDOM' या perl -e 'print int(rand(65535))'

    (उपरोक्त उदाहरण में, 65535 वापस लौटने के लिए अधिकतम संख्या है। आप स्क्रिप्ट के अंदर भी अन्य गणित लागू कर सकते हैं।)

  • ठीक से कॉन्फ़िगर की गई प्रणाली में, आपको इसके बारे में सूचित किया जाएगा cron स्वयं - यह हमेशा ईमेल द्वारा, त्रुटि संदेश सहित नौकरी आउटपुट भेजता है। हल्के MTA स्थापित करें।


इसके अलावा, मार में, $(( )) से अधिक पसंद किया जाता है `expr`


अंतिम बार मैंने जाँच की, /bin/sh एक वास्तविक शेल नहीं था, केवल डेबियन पर सिसडमिन (आमतौर पर बैश या डैश) के पसंदीदा शेल के लिए एक सिम्लिंक था।
Hello71

1
@ हैलो 71: जो मैंने पोस्ट में कहा है। फिर भी, यह सिस्टम सॉफ्टवेयर को लागू करने के लिए प्रथागत है /bin/sh (और यह बॉर्न शेल के साथ संगत होने की उम्मीद है)। एक उदाहरण है system() glibc में कार्य करते हैं। इसलिये /bin/sh आमतौर पर इंगित करता है सबसे तेजी से बॉर्न-संगत शेल; और sysadmin / etc / passwd के उपयुक्त लाइन में अपनी वरीयता निर्धारित करने वाला है, उस सिस्टम-वाइड को लागू करने के लिए नहीं
grawity

@ Hello71: ... ठीक है, ज्यादातर मैंने पोस्ट में क्या कहा। (मुझे पता है कि अधिकांश अन्य डिस्ट्रोस लिंक हैं sh सेवा मेरे bash, लेकिन यह प्रासंगिक नहीं लगता था।)
grawity

तुम सही हो, /bin/sh पानी का छींटा। अब तक, मैंने डैश के बारे में कभी नहीं सुना। मैंने इसे देखा और यह बैश का एक हल्का संस्करण है। इसके अलावा, मुझे नहीं पता था कि क्रोन एक "अपंग" वातावरण में चलता था, लेकिन यह विभिन्न अन्य समस्याओं की व्याख्या करता है जो मैंने अतीत में की हैं। Btw, मैं का उपयोग शुरू कर दिया $(()) लेकिन जब से यह काम नहीं किया मैंने सभी प्रकार के बदलावों की कोशिश की और समाप्त हो गया expr - बेशक, जो भी काम नहीं किया। लेकिन वह वह जगह है जहाँ मैंने समाप्त किया :-) क्या सीमाओं का उपयोग किए बिना एक सामान्य बैश शेल चलाना संभव है bash -c 'xxxx' ? Btw, क्या टिप्पणियों में लाइन ब्रेक लगाना संभव नहीं है?
marlar

@ उमरार: 1) dash एक खोल है। यह किसी भी अधिक या कम से कम सामान्य नहीं है bash। यह इसका कोई रूप नहीं है। 2) उत्तर में अंक # 1 और # 2 देखें।
grawity

1

cron आम तौर पर कम "पूर्ण" वातावरण के साथ चलता है, जिसका अर्थ है कि आपके पास बस एक ही पर्यावरण चर उपलब्ध नहीं है। जाहिरा तौर पर $RANDOM ऐसा एक है, और वास्तव में आपका sleep अपरिभाषित चर के कारण कमांड केवल एक त्रुटि के साथ विफल हो रही है - यही कारण है कि जब आप स्विच करते हैं तो आपकी कमांड बिल्कुल भी चलने में विफल रही है && के बजाय ;। (अच्छी तरह से वास्तव में, $RANDOM एक बैश फ़ंक्शन है, लेकिन cron पूर्ण बैश वातावरण में नहीं चलता है, जो स्पष्ट रूप से इस फ़ंक्शन का अभाव है।)

इस कार्य को पूरा करने के लिए, आपको एक अलग बैश स्क्रिप्ट का उपयोग करना होगा, जैसा आपने कहा था। वैकल्पिक रूप से, आप उपयोग करने के तरीके का पता लगाने में सक्षम हो सकते हैं cat /dev/urandom सीधे में cron कमांड, लेकिन यह संभवत: केवल एक अलग बैश स्क्रिप्ट के लिए आपके पास वर्तमान में स्थानांतरित करने के लिए आसान होगा।


1
यह सुंदर नहीं है, लेकिन मुझे यह समाधान मिला जो आपके सुझाव के अनुरूप है: नींद $ (expr) od -An -N1 -i /dev/urandom \% 30); आदेश
marlar

1
$RANDOM कुछ "पूर्ण" वातावरण का हिस्सा नहीं है। यह एक प्रक्रिया शुरू में सेट पर्यावरण चर के साथ कुछ नहीं करना है। यह बैश में "मक्खी पर" बनाया गया एक विशेष चर है। जब भी वैरिएबल पढ़ा जाता है तो इसका नया मान हमेशा उत्पन्न होता है। --- cron डिफ़ॉल्ट रूप से उपयोग करता है /bin/sh सिस्टम पर ऐसा कहां /bin/sh से जुड़ा नहीं है bash $RANDOM डिफ़ॉल्ट रूप से काम नहीं करेगा।
pabouk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.