নির্দিষ্ট সময়ের পরবর্তী ঘটনা পর্যন্ত ঘুমান


11

আমার একটি ধারাবাহিক কমান্ড বা একটি একক কমান্ড দরকার যা "4:00" এর মতো নির্দিষ্ট সময়ের পরবর্তী ঘটনা না হওয়া পর্যন্ত ঘুমায়।

আমি যে কিভাবে করতে হবে?

atকমান্ড বা cronjob একটি বিকল্প কারণ আমি স্ক্রিপ্ট আমি বর্তমানে আছি ছেড়ে না নয়।

আমি যে নির্দিষ্ট ক্ষেত্রে কথা বলছি সেটি হ'ল স্ক্রিনে চলমান একটি স্ক্রিপ্ট। এটি অত্যন্ত গুরুত্বপূর্ণ যে আমি স্ক্রিপ্ট দ্বারা নিজেই স্ক্রিপ্টটির সম্পাদন বন্ধ করবো না কারণ এখানে অনেকগুলি গুরুত্বপূর্ণ ভেরিয়েবল রয়েছে যা স্ক্রিপ্টের কোনও পর্যায়ে প্রয়োজন। স্ক্রিপ্টটি নিয়মিত কোনও ক্ষেত্রে কার্যকর করার কথা না। এটি কেবলমাত্র একটি নির্দিষ্ট সময়ে কার্যকর করা দরকার।

স্ক্রিপ্টে কোনও ফাইল বা অন্য কোনও কাজ যেমন ক্রোনজবস বা অন্যান্য স্ক্রিন তৈরি করতে হয় তবে এটি খুব সুস্পষ্ট হবে। এটি কেবল ডিজাইনের প্রশ্ন।

আমার সবেমাত্র একটি সুন্দর ধারণা ছিল:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

আপনার কি আরও ভাল ধারণা আছে?

অনুরোধ করা হলে আরও তথ্য যুক্ত করা হবে!


আপনি কি আপনার প্রশ্নটি কিছুটা স্পষ্ট করে বলতে পারেন? আপনি যখন বলছেন তখন কী বোঝাতে চাইছেন: "আমি বর্তমানে উপস্থিত স্ক্রিপ্টটি ছেড়ে যাব না"
sebelk

আপনার "স্ক্রিন" কীভাবে "জেগে উঠুন" ফাইলটির অস্তিত্ব আছে তা পরীক্ষা করে দেখুন এবং আবার যাচাইয়ের আগে কিছু সময়ের জন্য ঘুমান? তারপরে আপনি ক্রোনটির নির্ভরযোগ্যতা উপকার করে ফাইলটি তৈরি করতে ক্রোন ব্যবহার করতে পারেন, তবে আপনার দীর্ঘকালীন স্ক্রিপ্টও থাকতে পারে। স্ক্রিপ্টটি "ঘুম থেকে উঠুন" ফাইলটি ঘুমানো বন্ধ করে দেওয়ার পরে কেবল সরিয়ে দিন have
কুর্তম

মনে রাখবেন যে, একটি ম্যাক আপনি প্রতিস্থাপন করা উচিত date -dসঙ্গে date -jএবং প্রতিস্থাপন 4:00সঙ্গে 0400
pjvandehaar

উত্তর:


17

টার্ডনের পরামর্শটি কাজে আসবে তবে আমার ধারণা আমার কাজটি আরও দক্ষ।

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

এটি সেকেন্ডে প্রদত্ত সময় এবং বর্তমান সময়ের মধ্যে পার্থক্য গণনা করছে। সংখ্যাটি যদি নেতিবাচক হয় তবে আমাদের ঘুমাতে হবে এমন সেকেন্ডগুলি পেতে আমাদের পুরো দিনটির জন্য সেকেন্ড যোগ করতে হবে (যথাযথভাবে 86400) এবং সংখ্যাটি যদি ইতিবাচক হয় তবে আমরা কেবল এটি ব্যবহার করতে পারি।


সিস্টেম ঘড়িটি এগিয়ে / পিছনের দিকে চলে গেলে কী ঘটে (যেমন: এনটিপি)।
নটহাগো

10

এটি শেল স্ক্রিপ্ট হিসাবে ধরে নেওয়া, এটি কাজ করা উচিত:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

এটি 24 ঘন্টা বারের জন্য। আপনি যদি সকাল 4:00 টা থেকে 4:00 অপরাহ্ন উভয় অব্যাহত রাখতে চান তবে পরিবর্তে এটি ব্যবহার করুন:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

এটি একটি বিকল্প হতে পারে। আমি শুধু একটি ধারণা ছিল। আমি কয়েক মিনিটের মধ্যে ফিরে আসব।
ব্রেইনস্টোন

0

উপর OpenBSD নিম্নলিখিত একটি কম্প্যাক্ট ব্যবহার করা যেতে পারে */55 মিনিটের crontab(5)একটি মধ্যে কাজের 00ঘনঘন এক (থাকাকালীন সঠিক সময় অন্তর একই কাজের করণ সব নিশ্চিত কম ইমেল উত্পন্ন হয় করা,):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

মনে রাখবেন যে চূড়ান্ত পুনরাবৃত্তির উপর নকশাটিও date(1)ভেঙে ফেলবে sleep(1), কারণ 60মিনিটগুলি কোনও বৈধ সময় নয় (এটি না হলে!), সুতরাং আমাদের ইমেল রিপোর্ট পাওয়ার আগে আমাদের কোনও অতিরিক্ত সময় অপেক্ষা করতে হবে না।

আরও মনে রাখবেন যে পুনরাবৃত্তির যে কোনওটিতে এটির জন্য নির্ধারিত 5 মিনিটেরও বেশি সময় নেওয়া উচিত, sleepঅনুরূপভাবে বিন্দুমাত্র ঘুম না করে ডিজাইন করে ব্যর্থ হবে (কোন নেতিবাচক সংখ্যাকে কমান্ড-লাইন বিকল্প হিসাবে ব্যাখ্যা করা হয়েছে, তার চারপাশে মোড়কের পরিবর্তে) পরের ঘন্টা বা এমনকি অনন্তকাল), সুতরাং নিশ্চিত হয়ে নিন যে আপনার কাজ বরাদ্দ হওয়া সময়ের মধ্যে এখনও সম্পূর্ণ হতে পারে (উদাহরণস্বরূপ, যদি কেবলমাত্র একটি পুনরাবৃত্তির মধ্যে যদি 5 মিনিটের বেশি কিছু সময় লাগে তবে আমাদের তখনও ধরার সময় থাকবে, ছাড়াই পরের ঘন্টা প্রায় মোড়ানো কিছু)।

printf(1)প্রয়োজন হয় কারণ dateআশা মিনিট স্পেসিফিকেশন ঠিক দুটি সংখ্যা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.