ক্রোনটবে $ RANDOM নিয়ে সমস্যা


9

ক্রোনটিতে ND RANDOM নিয়ে আমার একটি অদ্ভুত সমস্যা হয়েছে। ক্রোনজব গুলির কয়েক মিনিট পরে আমি এলোমেলোভাবে একটি কমান্ড কার্যকর করতে চাই।

এই উদাহরণটি সরাসরি টার্মিনালে কাজ করে এবং 30 সেকেন্ড পর্যন্ত কমান্ডটি বিলম্ব করে (আপনি যা চান কমান্ডটি প্রতিস্থাপন করুন এটি আসলে / dev / ttyUSB0 এর প্রতিধ্বনি):

sleep `expr $RANDOM \% 30` ; command

যদি একই লাইনটি ক্রন্টবায় স্থাপন করা হয়, কমান্ডটি সর্বদা দেরি না করে অবিলম্বে গুলি চালায়:

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

যদি আমি $ র্যান্ডোম ছাড়াই কোনও অভিব্যক্তি ব্যবহার করি তবে এটি ভাল কাজ করে - এটি 15 সেকেন্ডের বিলম্ব করে:

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

অন্য কথায়, দেখে মনে হচ্ছে $ RANDOM ক্রোনটিতে কাজ করে না।

তবে এটি কেবল কারণেই নয় যে $ র্যান্ডোম নিজেই শূন্যের মূল্যায়ন করে, কারণ এরপরে এটি 10 ​​মিনিটের বিলম্ব দেয়:

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

আমি && এর পাঠানোর চেষ্টাও করেছি; তবে তাতে কোন লাভ হয় না। আসলে, তাহলে কমান্ডটি মোটেও গুলি চালায় না!

আমি অবশ্যই কোনও স্ক্রিপ্টে বিলম্ব রাখতে পারতাম যা ক্রোনটাব থেকে ডাকা হত তবে এটি আমার সমস্যাটি ব্যাখ্যা করে না এবং আমাকে শিখায় না :-)

এটি যদি কোনও পার্থক্য করে তবে এটি ডেবিয়ান লেনি।

উত্তর:


18

cron/bin/shকার্য সম্পাদন করতে শেল ব্যবহার করে । কিছু ডিস্ট্রোজে এটি একটি সিলেট লিঙ্ক dash। তাদের উভয়ই $RANDOMভেরিয়েবল সমর্থন করে না , যা একটি bashস্পেসিফিক এক্সটেনশন।

  • ভিক্সি-ক্রোন দিয়ে আপনি আপনার ক্রন্টবের SHELL=/bin/bashশীর্ষে একটি লাইন রাখতে পারেন ।

  • অন্যথায়, আপনি সঙ্গে নিষ্পত্তি করতে হবে bash -c 'echo $RANDOM'বা perl -e 'print int(rand(65535))'

    (উপরের উদাহরণে, 65535 হ'ল সর্বাধিক সংখ্যা। আপনি স্ক্রিপ্টের ভিতরেও অন্যান্য গণিত প্রয়োগ করতে পারেন))

  • সঠিকভাবে কনফিগার করা সিস্টেমে আপনাকে cronনিজেই এটি সম্পর্কে অবহিত করা হত - এটি সর্বদা ইমেলের মাধ্যমে ত্রুটি বার্তা সহ কাজের আউটপুট প্রেরণ করে। একটি লাইটওয়েট এমটিএ ইনস্টল করুন।


এছাড়াও, ব্যাশে, $(( ))বেশি পছন্দ করা হয় `expr`


শেষ আমি যাচাই করেছিলাম, /bin/shএকটি আসল শেল ছিল না, এটি কেবলমাত্র দেবিয়ানের সিসাদমিনের (সাধারণত বাশ বা ড্যাশ) পছন্দের শেলের একটি সিমিলিংক।
হ্যালো 71

1
@ হ্যালো 71: আমি পোস্টে যা বললাম তা। তবুও, সিস্টেম সফ্টওয়্যারটি চালু করার প্রথাগত /bin/sh(এবং এটি বোর্ন শেলের সাথে সামঞ্জস্যপূর্ণ হওয়ার প্রত্যাশা করে)। system()গ্লিবিসি-তে ফাংশনটির একটি উদাহরণ । সুতরাং /bin/shসাধারণত দ্রুততম বোর্ন-সামঞ্জস্যপূর্ণ শেলটি নির্দেশ করে; এবং
সিসাদমিন তার পছন্দটিকে

@ হ্যালো 71: ... ঠিক আছে, বেশিরভাগই আমি পোস্টে যা বলেছিলাম। (আমি অন্যান্য অধিকাংশ ডিস্ট্রো লিঙ্ক জানে shকরতে bash, কিন্তু এটা প্রাসঙ্গিক মনে হয়নি।)
user1686

আপনি ঠিক, /bin/shড্যাশ পয়েন্ট। এখন অবধি, আমি কখনই ড্যাশ সম্পর্কে শুনিনি। আমি এটি সন্ধান করেছি এবং এটি ব্যাশের হালকা ওজনের রূপ। এছাড়াও, আমি জানতাম না যে ক্রোনটি একটি "পঙ্গু" পরিবেশে চলেছিল, তবে এটি অতীতে অন্যান্য বিভিন্ন সমস্যা ব্যাখ্যা করে। বিটিডব্লিউ, আমি ব্যবহার শুরু করেছি $(())তবে এটি কার্যকর না হওয়ায় আমি বিভিন্ন প্রকারের তারতম্য চেষ্টা করে শেষ করেছি expr- যা অবশ্যই কার্যকর হয়নি work তবে আমি এখানেই শেষ করেছি :-) সীমাবদ্ধতা ব্যবহার না করে কোনও সাধারণ ব্যাশ শেল চালানো কি সম্ভব bash -c 'xxxx'? বিটিডব্লিউ, মন্তব্যে লাইন ব্রেক করা কি সম্ভব নয়?
মারারাল

@মারার: ​​1) dashএকটি শেল। এটি এর চেয়ে কম বা কম কোনও স্বাভাবিক নয় bash। এটিও এর বৈকল্পিক নয়। 2) উত্তরে # 1 এবং # 2 পয়েন্টগুলি দেখুন।
ব্যবহারকারীর 6868

2

cronসাধারণত কম "পূর্ণ" পরিবেশ নিয়ে চলে, যার অর্থ আপনার কাছে একই পরিবেশের ভেরিয়েবলগুলি সহজলভ্য নয়। স্পষ্টতই এর একটি $RANDOMহ'ল এবং প্রকৃতপক্ষে আপনার sleepকমান্ড অপরিজ্ঞাত পরিবর্তনশীল কারণে একটি ত্রুটি নিয়ে ব্যর্থ হচ্ছে - এজন্য আপনি &&পরিবর্তে স্যুইচ করলে আপনার কমান্ডটি মোটেই চালাতে ব্যর্থ হয়েছিল ;। (আচ্ছা, আসলে, $RANDOMএকটি বাশ ফাংশন, তবে cronএকটি পূর্ণ বাশ পরিবেশে চলে না, এতে স্পষ্টতই এই ফাংশনটির অভাব রয়েছে))

এই কাজটি সম্পাদন করার জন্য, আপনাকে যেমন বলেছে তেমন একটি পৃথক বাশ স্ক্রিপ্ট ব্যবহার করতে হবে। বিকল্পভাবে, আপনি কমান্ডে cat /dev/urandomসরাসরি ব্যবহারের উপায় বের করতে সক্ষম হতে পারেন cronতবে আপনার বর্তমানে যা আছে তা আলাদা বাশ স্ক্রিপ্টে সরিয়ে নেওয়া সহজতর হবে।


1
এটি সুন্দর নয়, তবে আমি এই সমাধানটি পেয়েছি যা আপনার পরামর্শের সাথে সাদৃশ্যযুক্ত: ঘুম $ (এক্সপ্রেস od -An -N1 -i /dev/urandom\% 30); কমান্ড
মারার

1
$RANDOMকিছু "পূর্ণ" পরিবেশের অংশ নয়। একটি প্রক্রিয়া শুরুতে পরিবেশ পরিবর্তনশীলগুলির সাথে এটির কোনও সম্পর্ক নেই। এটি ব্যাশের "ফ্লাই অন" ফ্ল্যাশ তৈরি করা একটি বিশেষ চলক। ভেরিয়েবলটি পড়লে এর নতুন মান সর্বদা উত্পন্ন হয়। --- cronডিফল্টরূপে /bin/shসিস্টেমগুলিতে এমন ব্যবহার হয় যেখানে /bin/shলিঙ্কযুক্ত bash $RANDOMনয় ডিফল্টরূপে কাজ করবে না।
পাবউক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.