আক্ষরিকভাবে প্রতি 3 দিন পরেই বাশ স্ক্রিপ্ট কার্যকর করুন


8

আমি প্রতি 3 দিন পরে আক্ষরিক অর্থে শেল স্ক্রিপ্ট সম্পাদন করতে চাই। ক্রনট্যাব ব্যবহার 01 00 */3 * *করে শর্তটি পুরোপুরি বাস্তবায়িত হবে না, কারণ এটি 31 তম এবং আবার এক মাসের প্রথম দিনে চলে run */3সিনট্যাক্স বলার অপেক্ষা রাখে না 1,4,7 ... 25,28,31 সমান।

স্ক্রিপ্টটি নিজেই শর্তাদি পরীক্ষা করে দেখার উপায় আছে এবং 3 দিন অতিবাহিত না হলে প্রস্থান করতে হবে। সুতরাং ক্রোন্টাব স্ক্রিপ্টটি প্রতিদিন চালায় তবে স্ক্রিপ্টটি নিজেই পরীক্ষা করে দেখত যে 3 দিন কেটে গেছে কিনা।

এমনকি আমি কিছু কোড খুঁজে পেয়েছি, তবে এটি আমাকে সিনট্যাক্স ত্রুটি দিয়েছে, কোনও সাহায্যের প্রশংসা করা হবে।

if (! (date("z") % 3)) {
     exit;
}

main.sh: line 1: syntax error near unexpected token `"z"'
main.sh: line 1: `if (! (date("z") % 3)) {'

4
তুমি আসলে কি বোঝাতে চাচ্ছো? কিভাবে */3কাজ করে না? "যদি 3 দিন কেটে যায় না": তিন দিন কিসের পরে? দয়া করে সম্পাদনা আপনার প্রশ্ন এবং নির্মল।
টেরডন

4
আক্ষরিক অর্থে? এটি একটি এক্স / ওয়াই প্রশ্নের মতো মনে হচ্ছে এবং আপনি যা করতে চাইছেন তা সম্পর্কে আপনি আসলে কথা বলতে চাইতে পারেন। আপনি কি স্ক্রিপ্ট চালানো থেকে ক্রন্টবকে থামানোর চেষ্টা করছেন?
যাত্রামন গীক

1
ক্রন্টব সমাধান কেন কাজ করবে না তা ব্যাখ্যা করতে প্রশ্ন সম্পাদনা করা হয়েছে।
তাভি

এই জাতীয় কিছু date("z") % 3 == 0একই সমস্যায় ভুগতে পারে: 29 শে ডিসেম্বর থেকে 3 শে জানুয়ারির মধ্যে চার দিনের জন্য শর্তটি মিথ্যা হবে, যদি না ডিসেম্বরটি একটি লিপ বছরের অংশ না থাকে।
রাইময়েড

উত্তর:


12

অবিলম্বে কোনও স্ক্রিপ্টটি বাতিল এবং প্রস্থান করতে যদি শেষ সম্পাদনাটি কমপক্ষে নির্দিষ্ট সময় আগে না ঘটে থাকে তবে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন যার জন্য একটি বাহ্যিক ফাইল দরকার যা শেষ মৃত্যুর তারিখ এবং সময় সঞ্চয় করে।

আপনার বাশ স্ক্রিপ্টের শীর্ষে এই লাইনগুলি যুক্ত করুন:

#!/bin/bash

# File that stores the last execution date in plain text:
datefile=/path/to/your/datefile

# Minimum delay between two script executions, in seconds. 
seconds=$((60*60*24*3))

# Test if datefile exists and compare the difference between the stored date 
# and now with the given minimum delay in seconds. 
# Exit with error code 1 if the minimum delay is not exceeded yet.
if test -f "$datefile" ; then
    if test "$(($(date "+%s")-$(date -f "$datefile" "+%s")))" -lt "$seconds" ; then
        echo "This script may not yet be started again."
        exit 1
    fi
fi

# Store the current date and time in datefile
date -R > "$datefile"

# Insert your normal script here:

হিসাবে একটি অর্থবহ মান নির্ধারণ datefile=এবং seconds=আপনার প্রয়োজনের মান মানিয়ে নিতে ভুলবেন না ( $((60*60*24*3))3 দিন মূল্যায়ন)।


আপনি যদি পৃথক ফাইল না চান, আপনি শেষ স্ক্রিপ্টের পরিবর্তনের সময় স্ট্যাম্পে শেষ নির্বাহের সময়টিও সঞ্চয় করতে পারেন। তার অর্থ তবে আপনার স্ক্রিপ্ট ফাইলে যে কোনও পরিবর্তন করা 3 টি কাউন্টার পুনরায় সেট করবে এবং স্ক্রিপ্টটি সফলভাবে চলমান থাকলে এমন আচরণ করা হবে।

এটি বাস্তবায়নের জন্য, আপনার স্ক্রিপ্ট ফাইলের শীর্ষে নীচে স্নিপেট যুক্ত করুন:

#!/bin/bash

# Minimum delay between two script executions, in seconds. 
seconds=$((60*60*24*3))

# Compare the difference between this script's modification time stamp 
# and the current date with the given minimum delay in seconds. 
# Exit with error code 1 if the minimum delay is not exceeded yet.
if test "$(($(date "+%s")-$(date -r "$0" "+%s")))" -lt "$seconds" ; then
    echo "This script may not yet be started again."
    exit 1
fi

# Store the current date as modification time stamp of this script file
touch -m -- "$0"

# Insert your normal script here:

আবার, seconds=আপনার প্রয়োজনের মানটি মানিয়ে নিতে ভুলবেন না ( $((60*60*24*3))3 দিন মূল্যায়ন করুন)।


হ্যাঁ, কোনও নির্দিষ্ট প্রোগ্রামের সর্বশেষ সফল প্রার্থনা রেকর্ড করার জন্য এক ধরণের বাহ্যিক ডেটা স্টোর প্রয়োজন এবং ফাইল সিস্টেম এটির জন্য একটি সুস্পষ্ট পছন্দ।
কিলিয়ান ফুট

এমনকি তারিখ সঞ্চয় করার দরকার নেই - প্রতিবার কেবল ফাইলটি স্পর্শ করুন এবং এটির টাইম স্ট্যাম্প পরীক্ষা করুন।
djsmiley2kStaysInside

@ djsmiley2k হ্যাঁ, আপনি ঠিক বলেছেন। স্ক্রিপ্ট ফাইলটি ম্যানুয়ালি সংশোধন করার ফলে পুনরায় সেট করতে বিলম্ব হওয়ার ঝুঁকিটি যদি গ্রহণযোগ্য হয়, তবে কেউ পরিবর্তনের সময় স্ট্যাম্পটিও ব্যবহার করতে পারেন। আমি আমার উত্তরে এটি যোগ করেছি।
বাইট কমান্ডার

এটি বর্তমান টাইমস্ট্যাম্পটি ফাইলে সংরক্ষণ করে (মানুষের পাঠযোগ্য তারিখের পরিবর্তে) কিছুটা গল্ফ করা যেতে পারে, তারপরে আপনি এর সাথে সময় কাটাতে পারবেন $[ $(date +%s) - $(< lastrun) ]। যদি স্ক্রিপ্টটি ক্রোন থেকে দিনের মধ্যে একবার চালানো হয় তবে আমি প্রয়োজনীয় সময়ের ব্যবধানে কিছুটা আলগা যুক্ত করতে পারি, যাতে স্ক্রিপ্টটির সম্পাদন যদি কয়েক সেকেন্ড দেরিতে হয়ে যায় তবে পরের বার পুরো দিনটি এড়িয়ে যাবেন না। এটি প্রতিদিন পরীক্ষা করা হয় যদি hours১ ঘন্টা অল্ট হয়ে যায়।
ilkkachu

ডেটফিলের এই উইজার্ডারিটি আসলে কাজ করেছিল, আপনাকে অনেক ধন্যবাদ!
তাভি

12

ক্রোন সত্যই এটির জন্য ভুল সরঞ্জাম। প্রকৃতপক্ষে একটি সাধারণভাবে ব্যবহৃত এবং অবহেলিত সরঞ্জাম বলা হয়েছে যা কাজ করতে পারে। এটি মূলত ইন্টারেক্টিভ ব্যবহারের জন্য ডিজাইন করা হয়েছে এবং আমি নিশ্চিত যে কেউ এটির জন্য আরও ভাল উপায় খুঁজে পাবেন।

আমার ক্ষেত্রে আমি স্ক্রিপ্টটি টেস্টজবস.টিএসটিস্টে তালিকাভুক্ত করছি এবং এতে একটি লাইন অন্তর্ভুক্ত রয়েছে।

উদাহরণ হিসাবে, আমার কাছে এটি টেস্টজবস.এসটিএসটি হিসাবে থাকবে

echo "cat" >> foo.txt
date >> foo.txt
at now + 3 days < testjobs.txt

আমার কাছে দুটি নিষ্পাপ কমান্ড রয়েছে, এটি আপনার শেলস স্ক্রিপ্ট হতে পারে। আমার ডিটারিস্টিনিস্টিক আউটপুট আছে কিনা তা নিশ্চিত করতে আমি ইকো চালিয়েছি এবং কমান্ডটি প্রয়োজনীয়ভাবে চালানো হয়েছে তা নিশ্চিত করার তারিখ। এই কমান্ডটি চালানোর সময়, এটি 3 দিনের জন্য একটি নতুন কাজ যুক্ত করে শেষ হবে। (আমি এক মিনিটের সাথে পরীক্ষা করেছি - যা কাজ করে)

আমি নিশ্চিত যে আমার যেভাবে দুর্ব্যবহার করা হয়েছে তার জন্য আমাকে ডাকা হবে, তবে এটি একটি কমান্ডের সময় বা পূর্ববর্তী কমান্ডের x দিন পরে চালানোর জন্য একটি সময় নির্ধারণের উপযুক্ত সরঞ্জাম ।


3
এখানে +1 আরও atভাল পদ্ধতির মতো বলে মনে হয় this এই পদ্ধতির সমস্যাটি হ'ল যে কোনও সময় আপনি ম্যানুয়ালি স্ক্রিপ্টটি চালান, আপনি প্রতি-3 দিনের atকাজের জন্য আরও একটি সেট যুক্ত করেন ।
দেউই মরগান

1
+1, তবে অন্য সমস্যা (@ ডেভিমোরগান দ্বারা চিহ্নিত একটি ব্যতীত) হ'ল যদি কোনও স্ক্রিপ্ট ব্যর্থ হয় তবে পরবর্তী সমস্ত স্ক্রিপ্ট চালু করা হবে না (যদি এটি ব্যর্থতার পরে হয়) তবে যতক্ষণ না কেউ বুঝতে পারে যে স্ক্রিপ্টটি রয়েছে ব্যর্থ হয়েছে এবং এটি আবার চালু করুন। এটি খারাপ হতে পারে, বা কখনও কখনও ভাল হতে পারে (উদা: ব্যর্থ হওয়ায় শর্তটি আর নেই: এটি ভাল যে এটি 3 দিনের মধ্যে আবার চেষ্টা করে না?)। এবং প্রতিবার একটি সামান্য ড্রাফ্ট রয়েছে ( atশীর্ষে থাকলে কয়েক মিলি সেকেন্ড , বা atদীর্ঘ-
সম্পাদনকারী

ইমেলগুলি প্রেরণ করতে পারে .... যা ব্যর্থতার সমাধান হতে পারে। atq এবং atrm ভুল কাজ সম্ভবত কুলিং জন্য অনুমতি দেয়? তত্ত্বের ক্ষেত্রে আপনি এটির জন্য একটি নির্দিষ্ট তারিখের স্ক্রিপ্ট করতে পারেন তবে তা অনুচিত এবং হ্যান্ডহোল্ড বলে মনে হয়।
যাত্রামন গীক

সুতরাং একটি ক্রোনজ আছে যা পরবর্তী রানের অস্তিত্বের জন্য পরীক্ষা করে; যদি একটি না থাকে তবে একটি 3 দিনের জন্য যুক্ত করুন এবং সতর্ক করুন (বা অবিলম্বে এটি চালান, এবং আবার চেক করুন)।
djsmiley2kStaysInside

3

প্রথমত, উপরের কোড খণ্ডটি অবৈধ বাশ সিনট্যাক্স, পার্লের মতো দেখাচ্ছে। দ্বিতীয়ত, zপ্যারামিটারের dateফলে এটি সংখ্যাসূচক সময় অঞ্চলকে আউটপুট দেয়। +%jদিন সংখ্যা। তোমার দরকার:

if [[ ! $(( $(date +%j) % 3 )) ]] ;then
     exit
fi

তবে আপনি এখনও বছরের শেষে অদ্ভুততা দেখতে যাচ্ছেন:

$ for i in 364 365  1 ; do echo "Day $i, $(( $i % 3 ))"; done
Day 364, 1
Day 365, 2
Day 1, 1

একটি ফাইলের মধ্যে একটি গণনা রাখা এবং এটি পরীক্ষা / আপডেট করার সাথে আপনার ভাগ্য ভাল হতে পারে।


1
পার্লের কোনও date()ফাংশন বিল্টিন নেই তবে এটি পিএইচপি-তে কিছুটা তারিখের মতো দেখায় (যেখানে z"বছরের দিনটি (0 থেকে শুরু"))
ইলক্কাচু 26:56

2

আপনি যদি স্ক্রিপ্টটি স্থিরভাবে চলতে পারেন তবে আপনি এটি করতে পারেন:

while true; do

[inert code here]

sleep 259200
done

এই লুপটি সর্বদা সত্য, সুতরাং এটি সর্বদা কোডটি কার্যকর করবে, তারপরে আবার লুপটি শুরু করার আগে তিন দিন অপেক্ষা করুন।


না কেন while true?
জোনাথন লেফলার

Hah! ভালো বল ধরা. আমার এটির দীর্ঘকাল ব্যবহার করার দরকার নেই, আমি ভুলে গিয়েছিলাম এটি উপস্থিত রয়েছে lol
mkingsbu

2
atসমাধান হিসাবে , এটি স্ক্রিপ্টের প্রতিটি সঞ্চয়ের সময় দ্বারা চালিত হবে। অবশ্যই স্ক্রিপ্ট শুরু হয় এবং তখন থেকে 3 দিন অবধি ঘুমানোর সময় বাঁচিয়ে কাজ করা যায় can
ilkkachu

2

আপনি ক্রোনের পরিবর্তে অ্যানাক্রন ব্যবহার করতে পারেন, এটি আপনার প্রয়োজনীয় যা করতে ঠিক ঠিক ডিজাইন করা হয়েছে। ম্যানপেজ থেকে:

দিনগুলিতে নির্দিষ্ট ফ্রিকোয়েন্সি সহ অ্যানাক্রন পর্যায়ক্রমে আদেশগুলি কার্যকর করতে ব্যবহার করা যেতে পারে। ক্রোন (8) এর বিপরীতে, এটি ধরে নেওয়া যায় না যে মেশিনটি ধারাবাহিকভাবে চলছে is সুতরাং, এটি এমন মেশিনগুলিতে ব্যবহার করা যেতে পারে যা 24 ঘন্টা চলমান না, প্রতিদিন, সাপ্তাহিক এবং মাসিক কাজগুলি সাধারণত ক্রোন দ্বারা নিয়ন্ত্রিত হয় তা নিয়ন্ত্রণ করতে।

যখন মৃত্যুদন্ড কার্যকর করা হয়, আনাক্রন একটি কনফিগারেশন ফাইল থেকে কাজের সাধারণত একটি তালিকা পড়ে, সাধারণত / ইত্যাদি / অ্যানাক্রান্তাব (দেখুন অ্যানাক্রান্তাব (5))। এই ফাইলটিতে অ্যানক্রন নিয়ন্ত্রণ করে এমন কাজের তালিকাসমূহ রয়েছে। প্রতিটি কাজের প্রবেশ দিনগুলিতে একটি সময় নির্দিষ্ট করে, কয়েক মিনিট বিলম্ব, একটি অনন্য কাজের শনাক্তকারী এবং শেল কমান্ড নির্দিষ্ট করে।

প্রতিটি কাজের জন্য, আনাক্রন চেক করে যে এই চাকরিটি গত n দিনে কার্যকর করা হয়েছে কিনা, যেখানে n সেই কাজের জন্য নির্দিষ্ট সময়সীমা নির্দিষ্ট করে। যদি তা না হয় তবে অ্যানক্রন দেরি প্যারামিটার হিসাবে নির্দিষ্ট মিনিটের সংখ্যা অপেক্ষা করার পরে কাজের শেল কমান্ডটি চালায়।

কমান্ডটি প্রস্থান করার পরে, আনাক্রন সেই কাজের জন্য একটি বিশেষ টাইমস্ট্যাম্প ফাইলটিতে তারিখটি রেকর্ড করে, যাতে এটি আবার কখন কার্যকর করা যায় তা জানতে পারে। সময় গণনার জন্য কেবল তারিখটি ব্যবহৃত হয়। ঘন্টা ব্যবহার করা হয় না।


ভাল, আমি নিশ্চিত আনাক্রন পরীক্ষা করব। ভাবছেন কেন এটি এত আন্ডাররেটেড হয় যদি এটি এ জাতীয় যাদু করতে পারে
তাবি

আসল প্রশ্ন: এতক্ষণে ক্রোনকে আরও ভাল কিছু দিয়ে কেন প্রতিস্থাপন করা হয়নি? fcron বিদ্যমান এবং আমি মনে করি systemd এর নিজস্ব সমাধানে কাজ করছে, তবে আমি বর্তমান অবস্থার সাথে আপডেট নেই date
টুইঙ্কলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.