প্রতি 30 সেকেন্ডে ক্রোন চালানো


312

ঠিক আছে তাই আমার কাছে ক্রোন রয়েছে যা প্রতি 30 সেকেন্ডে চালাতে হবে।

আমার যা আছে তা এখানে:

*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'''

এটি চলে, তবে প্রতি 30 মিনিট বা 30 সেকেন্ডে এটি কি চলছে?

এছাড়াও, আমি পড়ছি যে ক্রোন ব্যবহারের সেরা সরঞ্জাম না হতে পারে যদি আমি প্রায়শই এটি চালাই তবে। উবুন্টু ১১.০৪ এ আমি ব্যবহার করতে বা ইনস্টল করতে পারি এমন আরও একটি ভাল সরঞ্জাম আছে যা আরও ভাল বিকল্প হতে পারে? উপরের ক্রোন ঠিক করার কোনও উপায় আছে কি?


কমাটোস্ট, এবং যদি আপনার জাভাস্ক্রিপ্ট বা জাভা অ্যাপ্লিকেশনটি কোনও কারণে পড়ে এবং বেরিয়ে আসে তবে কী ঘটবে? কীভাবে এটি পুনরায় চালু হবে? :-)
প্যাক্সিডিয়াবল

12
একটু নোডজেএস অ্যাপ্লিকেশন যুক্ত করুন, লোল। একটু সি ++ অ্যাপ কেন হবে না? আমরা যখন সেখানে থাকি, আমরা এর নামটি 'ক্রোন' করতে পারি এবং এটি পরিষেবা হিসাবে চালাতে পারি।
অ্যান্ড্রু


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

উত্তর:


730

আপনার কাছে */30মিনিট মানে প্রতি মিনিটে কিন্তু 30 একটি পদক্ষেপ (অন্য কথায়, প্রতি আধা ঘন্টা) দিয়ে - সুনির্দিষ্টভাবে উল্লেখ করা। যেহেতু cronসাব-মিনিটের রেজোলিউশনে নেমে যায় না, তাই আপনাকে আর একটি উপায় খুঁজে বের করতে হবে।

একটি সম্ভাবনা, যদিও এটি কিছুটা কুলডেজ (ক) এর কিছুটা হলেও , দুটি কাজ করা উচিত, একটিটি 30 সেকেন্ডে অফসেট:

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

আপনি দেখতে পাবেন যে আমি মন্তব্যগুলি যুক্ত করেছি এবং সেগুলি সিঙ্ক্রোনাইজ করা সহজ ensure

উভয় কাজই cronআসলে প্রতি মিনিটে চলে তবে দ্বিতীয়টির কাজটি "মাংস" চালানোর আগে আধ মিনিট অপেক্ষা করবে /path/to/executable,।

অন্যান্য ( cronভিত্তিহীন) বিকল্পের জন্য, অন্যান্য উত্তরগুলি এখানে দেখুন, বিশেষত যেগুলি উল্লেখ করা হয়েছে fcronএবং systemd। এগুলি সম্ভবত আপনার সিস্টেমে সেগুলি ব্যবহারের ক্ষমতা রয়েছে বলে ধরে নেওয়া পছন্দনীয় (যেমন এটি ইনস্টল করা fcronবা systemdএটিতে একটি ডিস্রো স্থাপন করা)।


আপনি যদি কলডগি সমাধানটি ব্যবহার করতে না চান তবে আপনি একটি ছোট পরিবর্তন দিয়ে লুপ-ভিত্তিক সমাধানটি ব্যবহার করতে পারেন। আপনার প্রক্রিয়াটি কিছু আকারে চলমান থাকা আপনাকে এখনও পরিচালনা করতে হবে তবে, এটি একবার বাছাই করার পরে নিম্নলিখিত স্ক্রিপ্টটি কাজ করা উচিত:

#!/bin/env bash

# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.

((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done

while true; do
    # Start a background timer BEFORE the payload runs.

    sleep 30 &

    # Execute the payload, some random duration up to the limit.
    # Extra blank line if excess payload.

    ((delay = RANDOM % maxtime + 1))
    ((maxtime += 1))
    echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
    [[ ${delay} -gt 30 ]] && echo
    sleep ${delay}

    # Wait for timer to finish before next cycle.

    wait
done

কৌশলটি হ'ল আপনার পেডলোড চালুর আগে পটভূমিতেsleep 30 এটি শুরু করার জন্য তবে ব্যবহার করা । তারপরে, পে-লোড শেষ হওয়ার পরে, ব্যাকগ্রাউন্ডটি শেষ হওয়ার জন্য অপেক্ষা করুন ।sleep

পে-লোড যদি nসেকেন্ড (কোথায় n <= 30) নেয় , পে-লোডের পরে অপেক্ষা করা 30 - nসেকেন্ড হবে। যদি এটি 30 সেকেন্ডের বেশি সময় নেয় , তবে পরবর্তী চক্রটি পে-লোড শেষ না হওয়া পর্যন্ত বিলম্বিত হবে, তবে আর থাকবে না।

আপনি দেখতে পাবেন যে আউটপুটটিকে প্রাথমিকভাবে অনুসরণ করা সহজতর করার জন্য আমার এক মিনিটের সীমানায় শুরু করার জন্য সেখানে ডিবাগ কোড রয়েছে। আমি ধীরে ধীরে সর্বাধিক পেওলড সময় বাড়িয়ে দিচ্ছি যাতে আপনি অবশেষে পে-লোড 30-সেকেন্ড চক্রের সময়ের চেয়ে বেশি দেখতে পাবেন (অতিরিক্ত ফাঁকা লাইন আউটপুট তাই প্রভাবটি সুস্পষ্ট)।

একটি নমুনা রান অনুসরণ করে (যেখানে চক্রগুলি সাধারণত আগের চক্রের 30 সেকেন্ডের পরে শুরু হয়):

Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).

Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).

Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).

Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).

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


(ক) আমার সহকর্মীদের মধ্যে কেউ কেউ বলবে যে ক্লডেজগুলি আমার বিশেষত্ব :-)


29
এটি দুর্দান্ত কাজ, তাই আমি মনে করি এটি কলুষিততা ছাড়িয়ে গেছে
প্রশ্ন মার্ক

14
@ রুবো ,77, কেবল চালাতে যদি এটি এক সেকেন্ডেরও কম সময় নেয় :-) যদি এটি 29 সেকেন্ড সময় নেয় তবে এটি 0:00:00, 0: 00.59, 0:01:00, 0:01:59 এবং আরও কিছু সময়ে ঘটবে ।
প্যাক্সডিয়াবল্লো

1
সুপার স্নিগ্ধ, খুব সৃজনশীল!
কে রাফেল

2
দ্বিতীয় লাইনের চারদিকে বৃত্তাকার বন্ধনীগুলি কী কী?
নাইজেল অ্যাল্ডারটন

2
এটি একটি সমস্যার একটি সুন্দর সমাধান যা অন্যথায় কিছু কার্যের জন্য ক্রোনস কার্যকারিতাকে পঙ্গু করে দেয় যা কয়েক মিনিটের ভগ্নাংশে কার্যকর করা প্রয়োজন। ধন্যবাদ.
ফিডি বক্স

67

আপনি পারবেন না। ক্রনের একটি 60 সেকেন্ড গ্রানুলারিটি রয়েছে।

* * * * * cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''
* * * * * sleep 30 && cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''

এই সিনট্যাক্সটি কি প্যাক্সিডিয়াবলোর সমতুল্য? না কি সূক্ষ্ম পার্থক্য আছে?
নিকোলাস রাউল

পার্থক্যটি হ'ল: আমি বাইনারিটির মূল পথটি ব্যবহার করেছি। @ প্যাক্সিডিয়াবল এক ধরণের মেটা-সিনট্যাক্স ব্যবহার করেছেন। (এবং একটি উপ-শেলটি আহ্বান জানায়)
ওয়াইল্ডপ্লাজার

1
আমি বলতে চাইছি, এর &&পরিবর্তে ব্যবহার করছি ( ; )
নিকোলাস রাউল

2
দুঃখিত। না, একটি পার্থক্য আছে; &&অপারেটর স্বল্প সার্কিট, তাই শৃঙ্খল পরবর্তী কমান্ড যদি আগের ব্যর্থ মৃত্যুদন্ড কার্যকর করা হয় না।
ওয়াইল্ডপ্লাজার

এই গ্রানুলারিটি কোনও উপ-মিনিটের রেজোলিউশনের জন্য সমস্যা হওয়া উচিত নয়।
জুয়ান ইসাজা

37

ক্রনের গ্রানুলারিটি কয়েক মিনিটের মধ্যে এবং কিছু চালানোর জন্য প্রতি সেকেন্ডে জেগে ডিজাইন করা হয়নিx । আপনার পুনরাবৃত্তিটি একটি লুপের মধ্যে চালান এবং এটি আপনার যা প্রয়োজন তা করা উচিত:

#!/bin/env bash
while [ true ]; do
 sleep 30
 # do what you need to here
done

54
মন নয় রাখুন বেশ একই। যদি কাজের 25 সেকেন্ড লাগে (উদাহরণস্বরূপ), এটি প্রতি 30 সেকেন্ডের পরিবর্তে প্রতি 55 সেকেন্ডে শুরু হবে। এটি গুরুত্বপূর্ণ নয় তবে আপনার সম্ভাব্য পরিণতি সম্পর্কে সচেতন হওয়া উচিত।
পাক্সডিয়াবলো

7
আপনি পটভূমিতে কাজ চালাতে পারেন, তবে এটি প্রায় ঠিক 30 সেকেন্ডে চলবে।
ক্রিস কোস্টন

1
[সত্য] যখন ঘুমোবেন 30 # আপনার এখানে যা করা দরকার তা করুন --------- সম্পন্ন হওয়া উচিত ছোট ক্ষেত্রে
মন্দির

1
while [ true ]ক্রোন প্রতি মিনিটে একটি নতুন শুরু করবে বলে আপনি একই স্ক্রিপ্টের প্রচুর দৃষ্টান্ত তৈরি করার কারণ সৃষ্টি করবেন না ?
কারকামানো

2
যখন sleep $remainingTimeবাকীটাইমটি কাজটি গ্রহণের সময় 30 মিনিট কম তখন আপনি এটি করতে পারেন (এবং এটি যদি> 30 সেকেন্ড নেয় তবে শূন্যের ক্যাপ করুন)। সুতরাং আপনি প্রকৃত কাজের আগে এবং পরে সময় নিবেন এবং পার্থক্যটি গণনা করুন।
মাহেমফ

32

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

ক্রোন ফাইলে একক লাইনের চেয়ে সেটআপ করতে আরও কিছুটা সময় লাগে তবে আপনার যদি "প্রতি মিনিট" এর চেয়ে আরও ভাল কিছু প্রয়োজন হয় তবে এটি চেষ্টা করার পক্ষে উপযুক্ত।

সিস্টেমডি টাইমার মডেলটি হ'ল: টাইমারগুলি এমন একক যা টাইমার বিচ্ছিন্ন হওয়ার পরে পরিষেবা ইউনিট শুরু করে

সুতরাং আপনি যে স্ক্রিপ্ট / কমান্ডটি নির্ধারণ করতে চান তার জন্য আপনার একটি সার্ভিস ইউনিট এবং তারপরে একটি অতিরিক্ত টাইমার ইউনিট থাকতে হবে। একটি একক টাইমার ইউনিট একাধিক সময়সূচী অন্তর্ভুক্ত করতে পারে, তাই আপনার সাধারণত একাধিক টাইমার এবং এক পরিষেবার প্রয়োজন হয় না।

এখানে একটি সাধারণ উদাহরণ যা প্রতি 10 সেকেন্ডে "হ্যালো ওয়ার্ল্ড" এ লগ করে:

/etc/systemd/system/helloworld.service:

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer:

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target

এই ইউনিটগুলি স্থাপন করার পরে ( /etc/systemd/systemউপরে বর্ণিত হিসাবে, সিস্টেম-ব্যাপী সেটিংয়ের জন্য, বা ~/.config/systemd/userকোনও ব্যবহারকারী-নির্দিষ্ট সেটআপের জন্য), আপনাকে চালনার মাধ্যমে টাইমার (যদিও পরিষেবাটি নয়) সক্ষম করতে হবে systemctl enable --now helloworld.timer( --nowপতাকাটি টাইমারটিও শুরু করে তাত্ক্ষণিকভাবে, অন্যথায়, এটি কেবলমাত্র পরবর্তী বুট, বা ব্যবহারকারী লগইনের পরে শুরু হবে)।

[Timer]অধ্যায় এখানে ব্যবহার ক্ষেত্র হলো:

  • OnBootSec - প্রতিটি বুটের পরে এই পরিষেবাটি বেশ কয়েক সেকেন্ড পরে শুরু করুন।
  • OnUnitActiveSec- শেষবারের পরিষেবাটি চালু হওয়ার পরে এই কয়েক সেকেন্ড পরে পরিষেবাটি শুরু করুন। এটি হ'ল টাইমার নিজেই পুনরাবৃত্তি করে এবং ক্রোন কাজের মতো আচরণ করে।
  • AccuracySec- টাইমার যথার্থতা নির্ধারণ করে। টাইমারগুলি কেবল এই ক্ষেত্রের সেট হিসাবে সঠিক এবং ডিফল্টটি 1 মিনিট (ক্রোন অনুকরণ করে)। সর্বোত্তম নির্ভুলতার দাবি না করার মূল কারণ হ'ল বিদ্যুতের খরচ উন্নতি করা - যদি সিস্টেমডি পরবর্তী ইভেন্টগুলির সাথে অন্যান্য ইভেন্টের সাথে মিলে যেতে পারে, তবে সিপিইউ কম সময়ে জাগ্রত করা দরকার। 1msউপরোক্ত উদাহরণের আদর্শ নয় - আমি সাধারণত সেট সঠিকতা 1আমার সাব মিনিটের নির্ধারিত কাজ (1 সেকেন্ড), কিন্তু অর্থ দাঁড়ায় এই যে যে যদি আপনি "হ্যালো ওয়ার্ল্ড" বার্তাগুলি প্রদর্শন লগ তাকান, আপনি দেখতে চাই এটি প্রায় 1 সেকেন্ড দেরিতে হয়। যদি আপনি এটির সাথে ঠিক থাকেন তবে আমি সঠিকতাটি 1 সেকেন্ড বা তার বেশি সেট করার পরামর্শ দিচ্ছি।

আপনারা যেমন খেয়াল করেছেন, এই টাইমার ক্রোনকে এতটা ভালভাবে অনুকরণ করে না - এই অর্থে যে প্রতিটি প্রাচীর ঘড়ির সময়কালের শুরুতে কমান্ডটি শুরু হয় না (যেমন এটি ঘড়ির দশম সেকেন্ডে শুরু হয় না, তারপরে ২০ তম এবং আরও)। এর পরিবর্তে কেবল তখন ঘটে যখন টাইমারটি বাদ পড়ে। যদি সিস্টেমটি 12:05:37 এ বুট হয় তবে পরবর্তী সময় কমান্ডটি চালানো হবে 12:05:47, তারপরে 12:05:57, ইত্যাদিতে etc. যদি আপনি প্রকৃত প্রাচীর ঘড়ির যথার্থতায় আগ্রহী হন তবে আপনি করতে পারেন OnBootSecএবং OnUnitActiveSecক্ষেত্রগুলি প্রতিস্থাপন করতে এবং পরিবর্তে আপনার যে শিডিউলটি চান তা OnCalendarদিয়ে একটি নিয়ম সেট করতে চান (যা আমি যতটা বুঝতে পারি ক্যালেন্ডার ফর্ম্যাটটি ব্যবহার করে 1 সেকেন্ডের চেয়ে দ্রুত হতে পারে না)। উপরের উদাহরণটিও এইভাবে লেখা যেতে পারে:

OnCalendar=*-*-* *:*:00,10,20,30,40,50

শেষ দ্রষ্টব্য: আপনি সম্ভবত অনুমান করেছিলেন, helloworld.timerইউনিট ইউনিটটি শুরু করে helloworld.serviceকারণ তাদের একই নাম রয়েছে (বিয়োগটি ইউনিটের ধরণের প্রত্যয়)। এটি ডিফল্ট, তবে আপনি বিভাগটির Unitজন্য ক্ষেত্র সেট করে ওভাররাইড করতে পারেন [Timer]

আরও বেহাল বিবরণ এখানে পাওয়া যাবে:


2
আমি প্রায়শই মন্তব্য বিভাগের অধীনে এর মতো আরও ভাল উত্তর পেতে পারি। আইএমএইচও, যদিও ক্রোন নির্ধারিত কাজের জন্য প্রধান ছিল, তবে এই উত্তরটি "হ্যাক জব" নয় এবং অন্তর / ফ্রিকোয়েন্সি বিবেচনা করে দীর্ঘমেয়াদী কাজ সম্পাদনের সমান্তরালতার ঝুঁকিপূর্ণ হওয়ার কারণে এটি উত্তর গ্রহণযোগ্য হওয়া উচিত
কিউকো

2
দুর্দান্ত উত্তর, নির্বাচিত উত্তর হওয়া উচিত
গাইডড হ্যাকিং

21

দুটি ক্রোন প্রবেশের প্রয়োজন নেই, আপনি এটি দিয়ে একটিতে এটি রাখতে পারেন:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

আপনার ক্ষেত্রে তাই:

* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"


11
দ্রষ্টব্য: স্ক্রিপ্টটি চালাতে যদি এক সেকেন্ডেরও কম সময় লাগে তবে এটি সঠিকভাবে চলে
রুও 77

2
রুবো - যদি কাজটি সেকেন্ডে দীর্ঘ সময় নেয় (মিলি বা মাইক্রোসেকেন্ডের পরিবর্তে) শেষ হয়, তবে আপনি প্রতি মিনিটে দু'বার চালাতে সক্ষম হবেন না প্রতি ত্রিশ সেকেন্ডে it হ্যাঁ, 30 দিয়ে শুরু করুন এবং তারপরে 1 সেকেন্ডের বেশি হলে, রান হিসাবে প্রতি সেকেন্ডের আনুমানিক সংখ্যা থেকে বিয়োগ করুন।
অ্যান্ড্রু

2
আপনি পৃথকভাবে প্রতিটি রানের জন্য ত্রুটি প্রতিবেদন পেতে চাইলে এটিও সহায়তা করে না।
joeln

জোয়েলিন - আমি যে কমান্ডটি দিচ্ছি তা লগ বা আউটপুট ডেটা পেতে বাধা দেয় না, প্রশ্নটি সমাধান করার জন্য আমি আদেশটি সহজ করে দিয়েছি l লগিং ক্যাপচার করার জন্য, প্রতিটি কমান্ডের / আউটপুট পুনঃনির্দেশ করা উচিত যদি আপনার লগিং প্রয়োজন হয়, যেমন স্ক্রিপ্ট / রেল রানার -e প্রোডাকশন 'Song' 'Song.insert_latest' \ '' স্ক্রিপ্ট / রেল রানার -e প্রোডাকশন হিসাবে লেখা যেতে পারে 'be' 'Song.insert_latest' \ '' 2> & 1> / path_to_logfile এবং আবার একক ক্রোন প্রবেশের মধ্যে প্রতিটি কমান্ডের জন্য করা যেতে পারে।
অ্যান্ড্রু

13

আপনি এই অনুরূপ প্রশ্নের আমার উত্তর চেক করতে পারেন

মূলত, আমি সেখানে "runEvery.sh" নামক একটি বাশ স্ক্রিপ্ট অন্তর্ভুক্ত করেছি যা আপনি প্রতি 1 মিনিটে ক্রোন দিয়ে চালাতে পারেন এবং আপনি যে চালনা করতে চান সেই আসল কমান্ড এবং সেকেন্ডে আপনি যে চালনাটি চালাতে চান সেটির ফ্রিকোয়েন্সি হিসাবে আর্গুমেন্ট হিসাবে পাস করতে পারেন।

এটার মতো কিছু

* * * * * ~/bin/runEvery.sh 5 myScript.sh


10

ঘড়ি ব্যবহার করুন:

$ watch --interval .30 script_to_run_every_30_sec.sh

আমি কি কিছু ব্যবহার করতে পারি $ watch --interval .10 php some_file.php? বা watchশুধুমাত্র .sh ফাইল নিয়ে কাজ করে?
ইয়েভেনি শশকভ

আপনি ঘড়ি দিয়ে যে কোনও কিছু চালাতে পারেন। তবে বিরতিটি পরবর্তী কমান্ডের শেষ এবং শুরুর মধ্যে রয়েছে, সুতরাং --interval .30এক মিনিটে দু'বার চলবে না। অর্থাৎ watch -n 2 "sleep 1 && date +%s"এটি প্রতি 3s বৃদ্ধি পাবে।
jmartori

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

9

ক্রোন জব সেকেন্ডের বিরতিতে কোনও কাজের সময় নির্ধারণের জন্য ব্যবহার করা যাবে না। অর্থাৎ আপনি প্রতি 5 সেকেন্ডে চালানোর জন্য ক্রোন জব শিডিয়ুল করতে পারবেন না। বিকল্পটি হ'ল একটি শেল স্ক্রিপ্ট লিখুন যা এতে sleep 5কমান্ড ব্যবহার করে।

নিচের মত লুপের সময় ল্যাশ করার সময় ব্যাশ ব্যবহার করে শেল স্ক্রিপ্ট প্রতি 5-5-seconds.sh তৈরি করুন।

$ cat every-5-seconds.sh
#!/bin/bash
while true
do
 /home/ramesh/backup.sh
 sleep 5
done

এখন, nohupনীচের চিত্রের মতো ব্যবহার করে পটভূমিতে এই শেল স্ক্রিপ্টটি কার্যকর করুন । আপনি আপনার সেশন থেকে লগআউট করার পরেও এটি স্ক্রিপ্টটি কার্যকর করতে থাকবে। এটি প্রতি 5 সেকেন্ডে আপনার ব্যাকআপ.শেল স্ক্রিপ্টটি কার্যকর করবে।

$ nohup ./every-5-seconds.sh &

4
সময় বয়ে যাবে। উদাহরণস্বরূপ, যদি backup.shচালাতে 1.5 সেকেন্ড সময় লাগে তবে এটি প্রতি 6.5 সেকেন্ডে কার্যকর হবে। এটি এড়ানোর উপায় রয়েছে, উদাহরণস্বরূপsleep $((5 - $(date +%s) % 5))
কিথ থম্পসন

আমি নোহুপে নতুন, আপনার উদাহরণটি কার্যকর করার সময় নোহুপ 'এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই' ফিরিয়ে দিচ্ছে। কিছু অনুসন্ধানের পরে, আপনি নোহাপের পরে 'শ' মিস করেছেন বলে মনে হচ্ছে। $ Nohup SH ./every-5-seconds.sh &: এই ভালো লেগেছে
VHanded

6

Fcron ( http://fcron.free.fr/ ) ব্যবহার করুন - আপনাকে সেকেন্ডে গ্রানুলারিটি দেয় এবং ক্রোন (ভিক্সি-ক্রোন) এর চেয়ে আরও ভাল এবং আরও বেশি বৈশিষ্ট্যযুক্ত এবং স্থিতিশীলও দেয়। আমি খুব বোকা সেটিংসে একটি মেশিনে প্রায় 60 পিএইচপি স্ক্রিপ্ট চালানোর মতো বোকা জিনিস তৈরি করতাম এবং এটি এখনও এটির কাজটি করে!


1
পিএইচপি বিকাশকারীদের স্বীকারোক্তি; )
এরিক কিগাথি

3
প্রকৃতপক্ষে, একজন পিএইচপি বিকাশকারীদের সক্ষম করার জন্য একটি ইঞ্জিনিয়ারের স্বীকারোক্তি .... :)
আদি চিরু

6

dir মধ্যে /etc/cron.d/

নতুন একটি ফাইল তৈরি করুন excute_per_30s

* * * * * yourusername  /bin/date >> /home/yourusername/temp/date.txt
* * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt

প্রতি 30 সেকেন্ডে ক্রোন চালানো হবে


4

বর্তমানে আমি নীচের পদ্ধতিটি ব্যবহার করছি। কোন সমস্যা নিয়ে কাজ করে।

* * * * * /bin/bash -c ' for i in {1..X}; do YOUR_COMMANDS ; sleep Y ; done '

আপনি প্রতি চালাতে চান তাহলে এন সেকেন্ড তারপর এক্স হতে হবে 60 / এন এবং ওয়াই হতে হবে এন

ধন্যবাদ.


আপনি সম্ভবত পরিবর্তন YOUR_COMMANDSকরতে চানYOUR_COMMANDS & এটিকে , যাতে কমান্ডটি পটভূমিতে চালু হয়, অন্যথায়, যদি কমান্ডটি সেকেন্ডের ভগ্নাংশের চেয়ে বেশি নেয় - এটি পরবর্তী প্রবর্তনটি বিলম্ব করবে। সুতরাং এক্স = 2 এবং ওয়াই = 30 দিয়ে, যদি কমান্ডটি 10 ​​সেকেন্ড নেয় - এটি 30 মিনিটের পরিবর্তে মিনিটে এবং 40 সেকেন্ড পরে চালু হবে K
Gus

কোনও কারণে, আমি যদি /bin/bash -cঅংশটি বাদ দিয়ে (আর্গুমেন্টের উদ্ধৃতি সহ) স্ক্রিপ্টটি প্রতি মিনিটে কেবল পুনরাবৃত্তি উপেক্ষা করে চালিত হয় (আমার ক্ষেত্রে X=12এবংY=5 ) ।
অবিআই ২

3

ক্রন্টব জব মিনিট / ঘন্টা / দিনের মধ্যে কোনও কাজের সময় নির্ধারণের জন্য ব্যবহৃত হতে পারে তবে সেকেন্ডে নয়। বিকল্প :

প্রতি 30 সেকেন্ডে কার্যকর করতে একটি স্ক্রিপ্ট তৈরি করুন:

#!/bin/bash
# 30sec.sh

for COUNT in `seq 29` ; do
  cp /application/tmp/* /home/test
  sleep 30
done

crontab -eএই স্ক্রিপ্টটি কার্যকর করতে একটি ক্রন্টব ব্যবহার করুন :

* * * * * /home/test/30sec.sh > /dev/null

2
যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে এই স্ক্রিপ্টটি 30 বার চলে এবং প্রতিটি পুনরাবৃত্তির মধ্যে 30 সেকেন্ড অপেক্ষা করে। ক্রোনটিতে প্রতি মিনিটে এটি চালানো কীভাবে বোধ করবে?
ফুজিআমি

2

আপনি সেই স্ক্রিপ্টটি পরিষেবা হিসাবে চালাতে পারবেন, প্রতি 30 সেকেন্ডে পুনরায় চালু করুন

একটি পরিষেবা নিবন্ধন করুন

sudo vim /etc/systemd/system/YOUR_SERVICE_NAME.service

নীচের কমান্ডে আটকান

Description=GIVE_YOUR_SERVICE_A_DESCRIPTION

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=YOUR_COMMAND_HERE
Restart=always
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

পরিষেবাগুলি পুনরায় লোড করুন

sudo systemctl daemon-reload

পরিষেবাটি সক্ষম করুন

sudo systemctl enable YOUR_SERVICE_NAME

পরিষেবাটি শুরু করুন

sudo systemctl start YOUR_SERVICE_NAME

আপনার পরিষেবার স্থিতি পরীক্ষা করুন

systemctl status YOUR_SERVICE_NAME

1

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

 * * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log

লিপি:

cd /home/a/b/checkAgenda

java -jar checkAgenda.jar
sleep 20
java -jar checkAgenda.jar 
sleep 20
java -jar checkAgenda.jar 

1-6 কি প্রতিনিধিত্ব করে?
ফ্যান্টম 1007

@ ফ্যান্টম 7007 1-6 সোমবার থেকে শনিবার প্রতিনিধিত্ব করে যেখানে "-" একটি পরিসীমা এবং "0" রবিবার is এখানে একটি ভাল লিঙ্ক রয়েছে যা সমস্ত ক্ষেত্রকে খুব ভালভাবে ব্যাখ্যা করে এবং যেখানে আপনি এটি পরীক্ষা করতে পারেন: " crontab.guru/# * _ * _ * _ * _ * 1-6"
jfajunior

1

একটি শেল স্ক্রিপ্ট লিখুন .sh ফাইল

ন্যানো Every30second.sh

এবং স্ক্রিপ্ট লিখুন

#!/bin/bash
For  (( i=1; i <= 2; i++ ))
do
    write Command here
    sleep 30
done

তারপরে এই স্ক্রিপ্টটির জন্য ক্রোন সেট করুন -আর

(* * * * * /home/username/every30second.sh)

এই ক্রোন কল .sh ফাইল প্রতি 1 মিনিটে & .sh ফাইল কমান্ডে 1 মিনিটে 2 বার চালানো হয়

আপনি যদি 5 সেকেন্ডের জন্য স্ক্রিপ্ট চালনা করতে চান তবে 30 দ্বারা 5 কে প্রতিস্থাপন করুন এবং লুপের জন্য এটি পরিবর্তন করুন: For (( i=1; i <= 12; i++ ))

আপনি যখন কোনও সেকেন্ডের জন্য নির্বাচন করেন তখন 60 / আপনার দ্বিতীয় গণনা করুন এবং ফর লুপে লিখুন


0

নিম্নলিখিত পদ্ধতিটি ব্যবহার এবং ব্যবহার করার জন্য আমার কেবল একই ধরণের কাজ ছিল:

nohup watch -n30 "kill -3 NODE_PID" &

কয়েক ঘন্টা ধরে প্রতি 30 সেকেন্ডে আমার পর্যায়ক্রমিক কিল -3 (কোনও প্রোগ্রামের স্ট্যাক ট্রেস পেতে) থাকা দরকার।

nohup ... & 

এখানে শেলটি (নেটওয়ার্ক ইস্যু, উইন্ডোজ ক্রাশ ইত্যাদি ...) ছেড়ে দিলে আমি ঘড়ির সম্পাদনটি হারাব না তা নিশ্চিত করার জন্য এটি এখানে রয়েছে)


0

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


-1

শেল লুপে চালান, উদাহরণস্বরূপ:

#!/bin/sh    
counter=1
while true ; do
 echo $counter
 counter=$((counter+1))
 if [[ "$counter" -eq 60 ]]; then
  counter=0
 fi
 wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 &
 sleep 1
done

এমনকি অভিমানী যে 60একটি হওয়া উচিত 30, আপনি স্থানান্তর করতে যে চাইতে পারেন wget ভিতরেif বিবৃতি, অন্যথায় এটি প্রতি সেকেন্ডে মৃত্যুদন্ড কার্যকর হচ্ছে। যাই হোক না কেন, আমি নিশ্চিত না যে এটি কেবলমাত্র একক চেয়ে আরও ভাল কীভাবে sleep 30। আপনি যদি নিজের কাউন্টারের পরিবর্তে প্রকৃত ইউনিক্স সময়টি পর্যবেক্ষণ করছিলেন তবে এটি একটি পার্থক্য করবে।
প্যাক্সিডিয়াবলো

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