আমি কীভাবে কোনও স্ক্রিপ্টের মাধ্যমে ক্রন্টব তৈরি করব


153

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

এটা কি সম্ভব?




আপনি যদি কোনও ক্রন্টব এন্ট্রি সংশোধন বা মুছতে চান তবে নীচে আমার সমাধান দেখুন।
ব্রায়ান স্মিথ

উত্তর:


11

ক্রোন জবগুলি সাধারণত প্রতি ব্যবহারকারী ফাইলের অধীনে সংরক্ষণ করা হয় /var/spool/cron

আপনার পক্ষে সহজ কাজটি হ'ল সম্ভবত কাজটি কনফিগার করা একটি টেক্সট ফাইল তৈরি করুন, তারপরে ক্রোন স্পুল ফোল্ডারে এটি অনুলিপি করুন এবং নিশ্চিত করুন যে এটির সঠিক অনুমতি রয়েছে (600)।


20
ফাইলগুলিকে সরাসরি / var / spool / cron এ সংশোধন করার উপর ভিত্তি করে চিহ্নিত করা হয়। আসলে, যদি আপনি সেখানে ফাইলগুলি লক্ষ্য করেন তবে সেগুলিতে সাধারণত প্রথম পংক্তির মতো "এই ফাইলটি সম্পাদনা করবেন না" এর মতো সতর্কতা থাকবে।
Jare

12
@ জ্যারেড আমি এই ধারণার সাথে একমত হওয়ার সাথে সাথে বলেছিলাম যে এটি "উদ্বেলিত" খুব বেশি উপকার করে না। বরং অন্য কোন ফাইলটি সম্পাদনা করতে হবে তা বলুন , যদি থাকে তবে বা ফাইল সম্পাদনা করার ঝুঁকিটি ম্যানুয়ালি ব্যাখ্যা করুন। আমি স্বয়ংক্রিয় কমান্ড লাইনের মাধ্যমে কিছু ক্রোন জব তৈরির পরিকল্পনা করছি, এবং এই ফাইলটি সম্পাদনা করা যদি উভয়ই একমাত্র বিকল্প এবং উল্লেখযোগ্য পার্শ্ব প্রতিক্রিয়া ছাড়াই, আমি কেন এটি ব্যবহার করব না তা আমি দেখতে পাচ্ছি না।
বাল্মীপুর 11

47
আসল উত্তরের জন্য নিচে স্ক্রোল করুন।
জন রেড

1
আমার মতে, এই উত্তর উপায় উত্তম: stackoverflow.com/a/610860/2681752
galaux

2
আমি এই পদ্ধতির গ্রহণ এবং এটি জন্য আফসোস। RHEL- এ ডিরেক্টরি / var / spool / ক্রোন বিশ্ব নির্বাহযোগ্য নয়, তাই ব্যবহারকারীরা ডিরেক্টরিটি অতিক্রম করতে পারবেন না এবং ম্যানুয়ালি তাদের ফাইলগুলি সম্পাদনা করতে পারবেন না। আপনি যদি / var / spool / ক্রোন ওয়ার্ল্ডকে এক্সিকিউটেবল বানান, আপনার বন্ধুত্বপূর্ণ স্থানীয় সিসাদমিন আপনার প্রতি ক্ষিপ্ত হয়ে উঠবে এবং ক্রোনির প্যাকেজটি পুনরায় ইনস্টল করা বা আপডেট করা থাকলে অনুমতি পরিবর্তন ওভাররাইট করা যেতে পারে।
functionvoid

384

এখানে একটি ওলাইনার রয়েছে যা কোনও ফাইলের মধ্যে থাকা নতুন কাজটি ব্যবহার / প্রয়োজন হয় না:

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

2>/dev/nullগুরুত্বপূর্ণ, যাতে আপনি পাবেন না no crontab for usernameবার্তা যে কিছু * nixes উত্পাদন যদি বর্তমানে কোনো নিম্নলিখিতরূপে crontab পরিবর্তন এন্ট্রি।


14
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আমি যে ওয়ান লাইনার যুক্ত করতে চাইছি তা ইতিমধ্যে সেখানে রয়েছে কিনা তা
খতিয়ে দেখার

7
... ওহ অপেক্ষা করুন, এখানে যদি কিছু আমার ব্যবহারকারীর নিম্নলিখিতরূপে crontab পরিবর্তন হয় চেক করতে কিভাবে আগে আমি একটি স্ক্রিপ্ট সঙ্গে এটি যোগ দেওয়া হল: stackoverflow.com/a/14451184/3686125
ChrisPrime

1
এই স্ক্রিপ্টটি যদি কোনও ক্রোন টাস্কটি পুনরাবৃত্তি করতে এবং সংশোধন করার জন্য আদেশ হিসাবে লক্ষ্য করা থাকে তবে ক্রন্টবায় বিদ্যমান লাইনটি প্রতিস্থাপন করা ভাল হবে। বিভিন্ন ক্রোন কার্য (নিয়ন্ত্রণ-মার্কার -১, নিয়ন্ত্রণ-মার্কার -২, ইত্যাদি ...) নিয়ন্ত্রণ করতে বেশ কয়েকটি চিহ্নিতকারী ব্যবহার করা যেতে পারে: (ক্রোনটব-এল </ dev / নাল | গ্রেপ-ভি নিয়ন্ত্রণ-চিহ্নিতকারী -১; প্রতিধ্বনি '* / 5 * * * * / পাথ / টু / কাজের সাথে যুক্তিগুলি # নিয়ন্ত্রণ-চিহ্নিতকারী -১') | crontab -
শেফ

7
আমি দেখতে পেয়েছি যে এটি বিদ্যমান ক্রন্টব এন্ট্রিগুলি সরিয়ে ফেলছে এবং এছাড়াও আমার পৃথক ব্যবহারকারী (মূল) ব্যবহার করা প্রয়োজন তাই আমি বিদ্যমান এন্ট্রিগুলি বজায় রাখতে নিম্নলিখিতগুলি ব্যবহার করেছি: echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -আশা করি এটি কাউকে সহায়তা করবে
ড্যানি

60

ব্যবহারকারী crontabs (মূল সহ) এর জন্য আপনি এর মতো কিছু করতে পারেন:

crontab -l -u user | cat - filename | crontab -u user -

যেখানে "ফাইলের নাম" নামক ফাইলটিতে যুক্ত হওয়ার জন্য আইটেম রয়েছে contains আপনি এর পরিবর্তে sedবা অন্য কোনও সরঞ্জাম ব্যবহার করে পাঠ্য ম্যানিপুলেশন করতে পারেন cat। আপনার ব্যবহার করা উচিতcrontabসরাসরি ফাইল পরিবর্তন করার পরিবর্তে কমান্ডটি ।

অনুরূপ অপারেশন হবে:

{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -

আপনি যদি সিস্টেম ক্রন্টাবগুলি সংশোধন করতে বা তৈরি করছেন তবে এগুলি আপনি সাধারণ পাঠ্য ফাইল হিসাবে ম্যানিপুলেট করতে পারেন। তারা সংরক্ষিত হয় /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthlyডিরেক্টরি এবং ফাইলে /etc/crontabএবং /etc/anacrontab


প্রতিশ্রুতিবদ্ধ লাগছিল কিন্তু দ্বিতীয় পদ্ধতির চেষ্টা করে (এর সাথে echo), আমি পেয়েছি "ক্রোনট্যাব: ব্যবহারের ত্রুটি: ফাইলের নাম অবশ্যই প্রতিস্থাপনের জন্য নির্দিষ্ট করা উচিত।" ক্রোন ম্যান পৃষ্ঠাটি crontab [ -u user ] fileএকটি বাধ্যতামূলক ফাইলের নাম সহ সিনট্যাক্স দেখায় । এর পরিবর্তে পাইপযুক্ত ডেটা গ্রহণ করার কোনও কৌশল আছে কি?
মার্ক বেরি

1
@ মারকবেরি: সে সম্পর্কে দুঃখিত। পাইপে, একটি হাইফেন অবশ্যই ইনপুট থেকে এসেছে তা বোঝাতে ব্যবহার করতে হবে stdin। আমি আমার উত্তর সংশোধন করব।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

29

উবুন্টু এবং অন্যান্য অনেকগুলি ডিগ্রো-তে আপনি কেবল /etc/cron.dএকটি বৈধ ক্রন্টব প্রবেশের সাহায্যে একটি একক লাইন ধারণকারী ডিরেক্টরিতে একটি ফাইল রাখতে পারেন put একটি বিদ্যমান ফাইলে একটি লাইন যুক্ত করার দরকার নেই।

আপনার যদি প্রতিদিন চালানোর জন্য কিছু দরকার হয় তবে কেবল একটি ফাইল .োকান /etc/cron.daily। একইভাবে, আপনার কাছে ফাইল ড্রপ করতে পারেন /etc/cron.hourly, /etc/cron.monthlyএবং /etc/cron.weekly


5
এটি করতে আপনাকে অবশ্যই মূল হতে হবে।
কিথ

17

আপনার প্রশ্নের আরও সহজ উত্তর হ'ল:

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

আপনি নীচের মতো রিমোট সার্ভারগুলিতে ক্রোনজব সেটআপ করতে পারেন:

#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
  do
  echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done

লিনাক্সে, crontabফাইলটির ডিফল্ট অবস্থান /var/spool/cron/। এখানে আপনি crontabসমস্ত ব্যবহারকারীর ফাইলগুলি খুঁজে পেতে পারেন । আপনাকে কেবলমাত্র আপনার ক্রোনজব এন্ট্রি সম্পর্কিত ব্যবহারকারীের ফাইলে সংযুক্ত করতে হবে। উপরের উদাহরণে, রুট ব্যবহারকারীর ক্রন্টব ফাইলটি /root/test.shপ্রতিদিন সকাল 1 টায় চালানোর জন্য ক্রোনজব দিয়ে সংযুক্ত হয়ে যায় ।


যে হবে /var/spool/cron/crontabs/rootউবুন্টু উপর।
orহোর এমও

17

ক্রন্টব ফাইলগুলি কেবল পাঠ্য ফাইল এবং এগুলি অন্য কোনও পাঠ্য ফাইলের মতোই আচরণ করা যেতে পারে। crontabকমান্ডের উদ্দেশ্য হ'ল ক্রন্টব ফাইলগুলি সম্পাদনা করা আরও নিরাপদ। এই কমান্ডের মাধ্যমে সম্পাদনা করা হলে, ফাইলটি ত্রুটির জন্য পরীক্ষা করা হয় এবং কেবলমাত্র না থাকলে সেভ করা হয়।

crontab [path to file]কোনও ফাইলে সঞ্চিত ক্রোন্টাব নির্দিষ্ট করতে ব্যবহার করা যেতে পারে। পছন্দ করুন crontab -e, এটি কেবল ত্রুটিমুক্ত থাকলে ফাইলটি ইনস্টল করবে।

সুতরাং, কোনও স্ক্রিপ্ট সরাসরি ক্রোন ট্যাব ফাইলগুলি লিখতে পারে বা একটি অস্থায়ী ফাইলে লিখতে পারে এবং crontab [path to temp file]কমান্ডের সাহায্যে এগুলি লোড করতে পারে । সরাসরি লেখা অস্থায়ী ফাইল লিখতে বাঁচায়, তবে এটি সুরক্ষা চেক এড়িয়ে যায়।


2
আমার মতো নুবুকের জন্য, মনে রাখবেন যে এটি crontab [path to file].. এটি অবশ্যই আমার পক্ষে সেরা বিকল্প ছিল, কারণ এটি আরও সুস্পষ্ট কোডের অনুমতি দেয়। আমি পার্সেলগুলি ট্র্যাক করতে এবং স্ট্যাটাস সহ আমার ডেস্কটপ ওয়ালপেপার পরিবর্তন করতে ক্রোনট্যাব ব্যবহার করি। যখন আমি পার্সেলগুলি আশা করি না তখন প্রতি ঘন্টা এটি পরীক্ষা করার প্রয়োজন হয় না। এজন্য আমি স্ক্রিপ্টটি ক্রোন ফ্রিকোয়েন্সিটি স্বয়ংক্রিয়ভাবে সম্পাদনা করতে চেয়েছিলাম।
রাসমাস

1
@ রসমাস এটি একটি দুর্দান্ত স্ক্রিপ্ট বলে মনে হচ্ছে আমি চুরি করতে সক্ষম হতে চাই। সংক্ষেপে বা অনুরূপ মাধ্যমে ভাগ করে নেওয়ার কোনও সুযোগ?
সিলেডক্স

8

(মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই, তাই আমি একটি উত্তর হিসাবে যুক্ত করছি: তার উত্তরের পাশে মন্তব্য হিসাবে এটিকে নির্দ্বিধায় যোগ করুন)

জো ক্যাসাডন্টের ওয়ান-লাইনারটি সঠিক, যদি আপনি চালনা করেন তবে set -e, যদি আপনার স্ক্রিপ্টটি ত্রুটি থেকে ব্যর্থ হয়ে থাকে এবং যদি এখনও কোনও ক্রোনজবস না থাকে except সেক্ষেত্রে ওয়ান-লাইনার ক্রোনজব তৈরি করবে না, তবে স্ক্রিপ্টটি থামাবে না। নীরব ব্যর্থতা খুব বিভ্রান্তিকর হতে পারে।

কারণটি হ'ল crontab -lকোনও 1রিটার্ন কোড দিয়ে রিটার্ন দেয় যার ফলে পরবর্তী কমান্ডটি (দ্য echo) কার্যকর হয় না ... সুতরাং ক্রোনজব তৈরি হয় না। তবে যেহেতু এগুলিকে সাব-প্রসেস হিসাবে কার্যকর করা হয়েছে (প্রথম বন্ধনীগুলির কারণে) তারা স্ক্রিপ্টটি থামায় না।

(মজার বিষয়, আপনি যদি আবার একই কমান্ডটি চালনা করেন তবে এটি কার্যকর হবে: একবার আপনি কার্যকর হয়ে গেলে crontab -crontab -l তবে এটি করার পরেও কিছুই আউটপুট দেয় না, তবে এটি আর কোনও ত্রুটি ফিরিয়ে দেয় না no crontab for <user>) সুতরাং পরবর্তীটি echoকার্যকর করা হবে এবং ক্রোনট্যাব তৈরি করা হয়েছে)

যাইহোক, আপনি যদি সাথে চালনা করেন set -eতবে লাইনটি অবশ্যই:

(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -

হ্যাঁ, এটি আরও বেশি নিখুঁত।
ইয়াংভে স্নিন লিন্ডাল

7

যারা পরামর্শ দিচ্ছেন তাদের সংশোধন হিসাবে crontab -l | crontab -: এটি প্রতিটি সিস্টেমে কাজ করে না। উদাহরণস্বরূপ, আমাকে কয়েক বছরের সার্ভারে রুট ক্রন্টব-এ একটি পুরানো সংস্করণ SUSE চালাচ্ছে (কেন জিজ্ঞাসা করবেন না) a পুরাতন সুসগুলি নন- আইডেম্পোটেন্ট crontab -lতৈরির crontab -l | crontab -( আউটপুটটিতে মন্তব্য লাইনগুলি পূর্বনির্ধারিত করে (ডিবিয়ান ক্রোনটব ম্যানপেজে এই সমস্যাটি স্বীকৃতি দেয় এবং এর ডিফল্ট আচরণটি পরিবর্তনের জন্য ভিক্সি ক্রনের সংস্করণটি প্যাচ করে crontab -l))।

যেসব সিস্টেমে crontab -lমন্তব্যগুলি যুক্ত করা হয়েছে সেখানে ক্রন্টব্যাব প্রোগ্রামক্রমে সম্পাদনা করতে আপনি নিম্নলিখিত চেষ্টা করতে পারেন:

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=catক্রোনট্যাবকে catসম্পাদক হিসাবে (সাধারণত ডিফল্ট vi নয়) হিসাবে ব্যবহার করতে বলে , যা ফাইলটি পরিবর্তন করে না, পরিবর্তে এটি স্টডআউটে অনুলিপি করে। এটি এখনও ব্যর্থ হতে পারে যদি crontab -কোন crontab -eআউটপুট থেকে আলাদা কোনও ফর্ম্যাটে ইনপুট আশা করে । এর crontab -সাথে ফাইনালটি প্রতিস্থাপনের চেষ্টা করবেন না crontab -e- এটি কার্যকর হবে না।


4

ঠিক আছে /etc/crontabকেবলমাত্র একটি আসকি ফাইল তাই সরলতমটি কেবল সরল

 echo "*/15 * * * *   root     date" >> /etc/crontab

যা এমন একটি কাজ যুক্ত করবে যা প্রতি 15 মিনিটে আপনাকে ইমেল করবে। স্বাদে সামঞ্জস্য করুন এবং grepআপনার স্ক্রিপ্টকে আদর্শবান করতে লাইনটি ইতিমধ্যে যুক্ত করা হয়েছে কিনা তা দিয়ে বা অন্য মাধ্যমে পরীক্ষা করুন ।

উবুন্টু এট আল-তে, আপনি এমন ফাইলগুলিও ফেলে দিতে পারেন /etc/cron.*যার জন্য করা সহজ এবং পরীক্ষা করা যায় --- পাশাপাশি আপনি (সিস্টেম) কনফিগারেশন ফাইলগুলির সাথে ঝামেলা করেন না /etc/crontab


1
আমি মনে করি যে টেকনিক্যালি ক্রন্ডের ক্রোন্টাবের পরিবর্তনগুলি পর্যবেক্ষণ করার প্রয়োজন নেই, যদিও বাস্তবে বেশিরভাগ বাস্তবায়ন করা হয়, তাই আমি ক্রন্ডব -e এর পরে একটি কল করার পরামর্শ দেব recommend ক্রোনট্যাব-এডিটর ভেরিয়েবলকে সম্মান করে যদি মেমরিটি পরিবেশন করে, তাই মুহুর্তের জন্য এটি / বিন / সত্যে সেট করা ক্রোনট্যাবকে কেবল পুনরায় পড়তে বাধ্য করা উচিত।
উলিখ শোয়ার্জ

1
কোনও সাম্প্রতিক লিনাক্স সিস্টেমে এখনও এটি নিরীক্ষণ crond করে না এবং এটি অবশ্যই ওপি'র বর্ণিত প্ল্যাটফর্মে রয়েছে।
ডার্ক এডেলবুয়েটেল

আপনি যদি রুট হন এবং স্ক্রিপ্টটি রুট হিসাবে চালিত হয় তবেই। ওপিএস ক্ষেত্রে এটি কাম্য নয়।
কিথ

তাই না, আমার / etc / crontab এ প্রচুর নন-রুট এন্ট্রি রয়েছে। আপনার 'কেবল' ফাইলটিতে সংযুক্ত করতে sudo দরকার need যাইহোক, আমি যেমন বলেছি, সেখানে /etc/cron.*/ আছে তবে সেখানে লেখার জন্য আপনাকেও মূল হতে হবে।
ডার্ক এডেলবুয়েটেল

2

ক্রোন ফাইলটি সরাসরি সম্পাদনা না করে ক্রোনকে কোনও এন্ট্রি সংশোধন করার উপায় রয়েছে (যা নীচে বর্ণিত)।

crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -

আপনি যদি ক্রোন এন্ট্রি সরিয়ে নিতে চান তবে এটি ব্যবহার করুন:

crontab -l -u <user> | sed '/find/d' | crontab -u <user> -

আমি বুঝতে পারি যে গৌরব যা চেয়েছিল তা নয়, তবে সমস্ত সমাধান এক জায়গায় কেন নেই?


1

আমি পাইথনে ক্রোনটব মোতায়েন করার সরঞ্জামটি লিখেছি: https://github.com/monklof/deploycron

pip install deploycron

আপনার ক্রোনট্যাব ইনস্টল করা খুব সহজ, এটি ক্রোনটবকে সিস্টেমের বিদ্যমান ক্রন্টাবের সাথে একীভূত করবে।

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")

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