বিমূর্ত
সঠিক কোডটি হওয়া উচিত:
#!/bin/sh
[ "$#" -eq 0 ] && echo "Usage: $0 command [args]" && exit 1
[ "$(date -d tomorrow +'%d')" = 01 ] || exit 0
exec "$@"
এই স্ক্রিপ্টটি end_of_month.sh
কল করুন এবং ক্রનમાં কলটি কেবলমাত্র:
00 12 28-31 * * /path/to/script/end_of_month.sh command
এটি স্ক্রিপ্টটি চালিত করবে end_of_month
(যা অভ্যন্তরীণভাবে পরীক্ষা করবে যে দিনটি মাসের শেষ দিন) কেবল ২৮, ২৯, ৩০, ৩১ এবং ৩১ দিনে। অন্য কোনও দিন মাসের শেষের জন্য পরীক্ষা করার দরকার নেই।
পুরানো পোস্ট।
এটি রিচার্ড ব্লাম, ক্রিস্টিন ব্রেসনাহান পিপি 442, তৃতীয় সংস্করণ, জন উইলে অ্যান্ড সন্স © 2015 এর "লিনাক্স কমান্ড লাইন এবং শেল স্ক্রিপ্টিং বাইবেল" বইয়ের একটি উদ্ধৃতি।
হ্যাঁ, এটি যা বলে তা কিন্তু এটি ভুল / অসম্পূর্ণ:
- একটি ক্লোজিং মিস করছি
fi
।
[
নিম্নলিখিত এবং এর মধ্যে স্থানের প্রয়োজন `
।
- এটা তোলে হয় জোরালোভাবে $ (...) পরিবর্তে ব্যবহার করা বাঞ্ছনীয়
`…`
।
- এটা খুবই গুরুত্বপূর্ণ যে আপনার চারপাশের কোট ব্যবহার প্রসারণও মত
"$(…)"
;
পরে একটি অতিরিক্ত আছেthen
আমি কিভাবে জানবো? (ভাল, অভিজ্ঞতা দ্বারা ☺) তবে আপনি শেলচেক চেষ্টা করতে পারেন । বইটি থেকে কোডটি আটকান (নক্ষত্রের পরে) এবং এটি আপনাকে উপরের তালিকাভুক্ত ত্রুটিগুলি এবং "নিখোঁজ শেবাং" প্রদর্শন করবে। শেলচেকের কোনও ত্রুটি ছাড়াই স্ক্রিপ্টটি হ'ল:
#!/bin/sh
if [ "$(date +%d -d tomorrow)" = 01 ] ; then script.sh; fi
সেই সাইটটি কাজ করে কারণ যা লেখা হয়েছিল তা হ'ল "শেল কোড"। এটি এমন একটি বাক্য গঠন যা বহু শেলগুলিতে কাজ করে।
কিছু সমস্যা যা শেলচেকের উল্লেখ নেই:
এটি ধরে নেওয়া হচ্ছে যে ডেট কমান্ডটি জিএনইউ তারিখ সংস্করণ। একটি -d
বিকল্প যা tomorrow
মান হিসাবে গ্রহণ করে (ব্যস্তবক্সে একটি -d বিকল্প রয়েছে তবে কাল তা বুঝতে পারে না এবং BSD এর -d
বিকল্প রয়েছে তবে সময়ের "প্রদর্শন" সম্পর্কিত নয়)।
সমস্ত বিকল্পের পরে ফর্ম্যাটটি সেট করা ভাল date -d tomorrow +'%d'
।
ক্রোন শুরুর সময়টি সর্বদা স্থানীয় সময় থাকে, যা ডিএসটি (দিবালোক সংরক্ষণের সময়) সেট করা বা আনসেট না হয়ে থাকলে সঠিক দিনের গণনার চেয়ে 1 ঘন্টা আগে একটি কাজ শুরু করতে পারে।
আমরা যা করেছি তা হ'ল একটি শেল স্ক্রিপ্ট যা ক্রোন দিয়ে ডাকা যেতে পারে। আমরা প্রোগ্রামটির যুক্তিগুলি স্বীকার করার জন্য স্ক্রিপ্টটি আরও পরিবর্তন করতে পারি বা কার্যকর করার জন্য কমান্ড, এর মতো (অবশেষে, সঠিক কোড):
#!/bin/sh
[ "$#" -eq 0 ] && echo "Usage: $0 command [args]" && exit 1
[ "$(date -d tomorrow +'%d')" = 01 ] || exit 0
exec "$@"
এই স্ক্রিপ্টটি end_of_month.sh
কল করুন এবং ক্রનમાં কলটি কেবলমাত্র:
00 12 28-31 * * /path/to/script/end_of_month.sh command
এটি স্ক্রিপ্টটি চালিত করবে end_of_month
(যা অভ্যন্তরীণভাবে পরীক্ষা করবে যে দিনটি মাসের শেষ দিন) কেবল ২৮, ২৯, ৩০, ৩১ এবং ৩১ দিনে। অন্য কোনও দিন মাসের শেষের জন্য পরীক্ষা করার দরকার নেই।
সঠিক পথটি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন। ক্রোন এর ভিতরে থাকা PATH ব্যবহারকারীর PATH এর মতো হবে না (সম্ভবত না)।
নোট করুন যে মাসের স্ক্রিপ্টের একটি শেষ রয়েছে যা পরীক্ষিত হয়েছে (নীচে নির্দেশিত হিসাবে) অন্যান্য অনেকগুলি ইউটিলিটি বা স্ক্রিপ্ট কল করতে পারে।
সম্পূর্ণ ক্রমান্ড লাইনের সাহায্যে ক্রোন উত্পন্ন করে এমন অতিরিক্ত সমস্যাও এড়াতে পারে:
- ক্রোন কমান্ড লাইনটি বিভাজন করে
%
এমনকি কোনওটির সাথে '
বা "
(কেবল \
এখানে একটি কাজ) উদ্ধৃত হয় । এটি একটি সাধারণ উপায় যেখানে ক্রোন জবগুলি ব্যর্থ হয়।
কোনও পরীক্ষায় end_of_month.sh
স্ক্রিপ্ট সঠিকভাবে কাজ করে কিনা তা পরীক্ষা করতে পারবেন (মাসের শেষে অপেক্ষা না করে এটি কাজ করে না এটি আবিষ্কার করে) নকল সময় দিয়ে পরীক্ষা করে:
$ faketime 2018/10/31 ./end_of_month echo "Command will be executed...."
Command will be executed....