কীভাবে সঠিকভাবে একটি রুট ক্রোন জব সেটআপ করবেন


36

আমি রুট হিসাবে একটি বাশ স্ক্রিপ্ট চালানোর জন্য, প্রতি ঘন্টা, মাসের প্রতি দিন, প্রতি ঘন্টা, 7,37 মিনিটে চালানোর জন্য একটি মূল ক্রোন জব সেট আপ করার চেষ্টা করেছি। এই স্ক্রিপ্টটি অবস্থিত /usr/binএবং নামযুক্ত tunlrupdate.sh। এটি টানলারের ডিএনএস আপডেট করে।

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

এই বাশ লিপিটি এখানে উপলব্ধ ।

যখন অনুরোধ করা হয় তখন স্ক্রিপ্টটি লিখতে থাকে যে লগতে অবস্থিত /var/log/tunlr.log

এই রুট ক্রোন জবটি যুক্ত করতে আমি রুটের ক্রন্টাবের জন্য মানকটি ব্যবহার করেছি

sudo crontab -e

এবং এই 2 লাইন শেষে .োকানো। আমি আশা করি ক্রোন স্ক্রিপ্টটি মূল হিসাবে চালাবে।

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

পরবর্তী কমান্ড sudo crontab -lনিশ্চিত করেছে যে ক্রোন জব প্রবেশ করা হয়েছে।

আমি উবুন্টুকে রিবুট করেছি এবং ক্রোন জবটি সঠিকভাবে চালু করা হলে লগ ফাইলটি পরীক্ষা করে দেখছিলাম। তবে লগফাইলে এমন কিছুই নেই /var/log/tunlr.logযার অর্থ কাজটি কখনই সফলভাবে শুরু করা হয়নি।

আমি যদি কমান্ড লাইন থেকে স্ক্রিপ্টটি চালিত করি তা পরীক্ষা করেছিলাম

sudo /usr/bin/tunlrupdate.sh

তারপরে লগফাইলে আপডেট করা হয়।

আমার সিস্টেমে পরিকল্পনা অনুযায়ী এই ক্রোন জব কেন চলছে না?

আপডেট 1: এখন পর্যন্ত প্রস্তাবিত সমস্ত সমাধান কাজ করে না। আমি সিস্টেম লগ তালিকাভুক্ত করার জন্য একটি সি এল এলির জন্য ওলিকে ধন্যবাদ জানাই sudo grep CRON /var/log/syslog। তবে আমি একটি CRON ত্রুটি পেয়েছি

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

স্ক্রিপ্টের কার্যকারিতা বা এই প্রস্তাবিত সমাধান ব্যতিরেকে প্রস্তাবিত PATH = সন্নিবেশ এবং মূল থেকে নিখুঁত পথের ব্যবহার সহ আমি এখনও এই ত্রুটি পেয়েছি।

কিছু অনুসন্ধানের পরে আমি এখানে বর্ণিত /usr/lib/php5/maxlifetimeহিসাবে ফাইলটিতে ত্রুটিটি স্থির করেছিলাম :Change #!/bin/sh -e --> #!/bin/sh -x

তারপরে আমার সিস্টেমে CRON ত্রুটি লগ তালিকাভুক্ত করা হচ্ছে

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

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

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

আমি এখনও ক্রোন কাজ পেতে পারি না। লগ ফাইলে কিছুই লেখা হয় না। এমনকি খালি স্ক্রিপ্ট ক্রোন চলবে না? আমি পাই না। আমি জানি যে এই 2 লাইনে হ্রাস একটি স্ক্রিপ্ট চেষ্টা করছি:

#!/bin/bash
exit 0

এবং এখনও একই ত্রুটি লগ। ক্রোন স্ক্রিপ্টটি দিয়ে যায় না ...


আপনি যদি এটি "রুট" ক্রোনজকে মৌমাছি রাখতে চান তবে আপনাকে রুট হতে হবে তবে আপনি ক্রন্টব-টাইপ করুন। এছাড়াও আপনাকে কেবল রুট হিসাবে লগইন করতে হবে (কনসোল টাইপ "সু রুট") এবং তারপরে ক্রন্টব-ই (এই ক্ষেত্রে sudo প্রয়োজন হয় না)।
ওল্ফগ্যাং

ভাল। আমি আপনার উত্তর এর বিন্দু দেখতে পাচ্ছি না? Do sudo crontab -l দ্বারা রিপোর্ট করা হিসাবে টাইপিং $ sudo crontab -e কাজটি করেছে, অর্থাৎ নতুন কাজের বিবরণী রেখাটি রুটের ক্রোনটিতে যুক্ত করা হয়েছে। সে অনুযায়ী কাজটি ব্যবহারকারী ক্রোনটিতে উপস্থিত নেই যেমন ont crontab -l এখানে কোনও ক্রোন জব যুক্ত ছিল তা দেখাবেন না।
আন্তোনিও

@ ওল্ফগ্যাংভোগল তিনি "সুডো" ব্যবহার করেছেন যা প্রত্যাশা অনুযায়ী কাজ করে।
অ্যালেক্সিস উইল্কে

উত্তর:


68

আপনি যদি কোনও সাধারণ ব্যবহারকারী হিসাবে স্ক্রিপ্ট চালাতে চান :

crontab -e

এবং লাইন যুক্ত করুন:

07,37 * * * * /usr/bin/tunlrupdate.sh

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

sudo crontab -e

এবং একই লাইন যুক্ত করুন:

07,37 * * * * /usr/bin/tunlrupdate.sh

@ নেটগেটোআরুলস যদি আপনি আউটপুট না ফেলে থাকেন তবে কী দেখবেন?
অ্যাঞ্জেলো ফুকস

@ অ্যাঞ্জেলোফুচস পুরানো মন্তব্য ... অবশ্যই আমি সেই আদেশটি মূল হিসাবে ( sudo crontab -eপরিবর্তে crontab -e) চেষ্টা করেছিলাম । বা অন্য কিছু, যাইহোক এটি কার্যকর হয়
NineCattoRules

10

ঠিক আছে, শেষ পর্যন্ত কাজ সমাধান। সিসলগে আমি পুনরাবৃত্তি এবং আকর্ষণীয় দেখলাম:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

এটির মতো শোনার মতো শব্দগুলি একটি সেন্টিমিটার হিসাবে স্বীকৃত ছিল না। আমি ইতিমধ্যে ব্যবহার করে মূলের ক্রোন ব্যবহার করেছি $ sudo /usr/bin/tunlrupdate.sh। তারপরে আমি মূল স্ক্রিপ্টটি দিয়ে চেষ্টা করেছি (ইউএনআইএক্স সেন্টিমিটারের তারিখের একটি ভুলের জন্য সংশোধন করেছেন:% এম যা মাসে হয় তা কয়েক মিনিটের জন্য ব্যবহৃত হত যা% এম হয়) নিম্নলিখিতটি (যা ক্রোন লাইন থেকে মূলটি সরিয়ে দেয়):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

এটি চূড়ান্ত সমাধান হিসাবে প্রমাণিত। [যদিও আমি প্রচুর সাহিত্যে ক্রোন লাইনের মূলের সাথে ভ্রান্ত রেখাটি উল্লেখ করে দেখতে পেয়েছি। সেটা একটা ভুল ছিল].


ভাল পয়েন্ট ওলি। আমি যে আপনার সাথে একমত। রেফারেন্সের জন্য ব্যবহারকারীর ক্রোনটব / var / spool / cron / crontabs / user-name বা root / var / spool / cron / crontabs / root এর জন্য সংরক্ষণ করা হয়। এই পৃষ্ঠাটি জিজ্ঞাসা করুন জিজ্ঞাসাটি করুন / প্রশ্নগুলি / 216692/ কোথাও-is- the- user-crontab-stored ধারণকৃত ফোল্ডারটি ইতিমধ্যে ব্যবহারকারীর নাম দিয়েছে।
আন্তোনিও

ঠিক আছে, আপনার সেই তথ্য দরকার নেই, কারণ আপনার কেবল crontabকমান্ড দিয়ে ক্রন্টব ফাইলগুলি সম্পাদনা করা উচিত (ক্রন্টব ফাইলগুলি নীচে বাদে /etc)।
ওলি

1
@ অ্যান্টোনিও ব্যবহারকারীর নাম ক্ষেত্র সহ স্কোরগুলি কেবলমাত্র /etc/crontab(সিস্টেম-ব্যাপী ক্রন্টবায়) ব্যবহৃত হয়। ব্যবহার sudo crontab -eআপনি সাধারণত খুঁজে পাওয়া যেতে পারে যা root এর নিম্নলিখিতরূপে crontab পরিবর্তন সাথে এসেছেন পরিশ্রমী/var/spool/cron/crontabs
Matijs

2

ক্রোন সম্পর্কিত একটি "সমস্যা" হ'ল পরিবেশের ভেরিয়েবলের অভাব ( স্পষ্ট সুরক্ষার কারণে)। আপনি সম্ভবত পাঠ এবং হোম অনুপস্থিত। আপনি স্ক্রিপ্টে সরাসরি বা ক্রন্টব ফাইলের মধ্যে এটি সংজ্ঞায়িত করতে পারেন।

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

স্ক্রিপ্ট দ্বারা প্রয়োজনীয় সমস্ত ভেরিয়েবলগুলি সংজ্ঞায়িত না করা পর্যন্ত আপনাকে পরীক্ষা করতে হবে।


1
এটি এখানেই একমাত্র উত্তর যা আসলে আমার পক্ষে কাজ করেছিল। আমি /etc/crontabফাইল থেকে শেল এবং পাথের স্টেটমেন্টগুলি অনুলিপি করে সেগুলিতে আটকালাম এবং কমান্ডটি sudo crontab -eকোনও সমস্যা ছাড়াই মূল হিসাবে চলেছে। ধন্যবাদ!
টেরেন্স

0

ক্রোন ত্রুটির বার্তা সাধারণত - ডিফল্টরূপে - ইমেলের মাধ্যমে প্রেরণ করা হয়। রুটের জন্য ইমেল রয়েছে কিনা তা পরীক্ষা করতে পারেন sudo mail, বা কেবল /var/mail/rootউদাহরণস্বরূপ বিষয়বস্তুগুলি পরীক্ষা করে sudo less /var/mail/root


যদি ইমেল বার্তাগুলি সহায়তা না করে তবে এটিও দেখুন /var/log/syslog:

sudo grep CRON /var/log/syslog

অ্যালেক্সিস উইল্ক যেমন ইতিমধ্যে বলেছে, ক্রোনের পরিবেশের ভেরিয়েবলগুলি সেট করার জন্য আলাদা পদ্ধতি রয়েছে।

আপনার স্ক্রিপ্ট প্রয়োজন

PATH=/sbin:/bin:/usr/bin

crontab যাও। HOMEপ্রয়োজন হবে না। আপনার স্ক্রিপ্টগুলিতে আপনার নিখুঁত পাথগুলি ব্যবহার করা উচিত, যেমন /bin/dateপরিবর্তে date। আপনি প্রতিটি কমান্ডের জন্য যথাযথ পাথগুলি খুঁজে পেতে পারেন which command_name, উদাহরণস্বরূপ

$ which date
/bin/date

আপনার প্রস্তাবিত গ্রেপ সিআরএন / ভার্ / লগ / সিস্লোগে চালিয়ে আমি বোকা বানাচ্ছি ফেব্রুয়ারী 11 14:37:01 মারিয়াস-পিসি ক্রোন [7826]: (রুট) সিএমডি (রুট / ওএসআর / বিন / ভাগলুপডেট.শ) ফেব্রুয়ারী 14 14: 37:01 মারিয়াস-পিসি ক্রোন [25 78২৫]: (মূল) মেইল ​​(আউটপুটটির 1 বাইট প্রেরণ; তবে 0x00ff স্ট্যাটাস পেয়েছে, # 012) ফেব্রুয়ারী 11 14:39:01 মারিয়াস-পিসি ক্রোন [7849]: (মূল) সিএমডি ( [-x / usr / lib / php5 / সর্বোচ্চজীবন] && [-d / var / lib / php5] && সন্ধান করুন / var / lib / পিএইচপি 5 / -ডেপথ -মাইন্ডেপথ 1-ম্যাক্সডেপথ 1-টাইপ এফ -মিসিন + $ (/ usr / lib / php5 / maxLiveTime)! -execdir fuser -s {} 2> / dev / null \; -ডিলেট) আমি ক্রনে PATH এর জন্য কিছু সংজ্ঞা যুক্ত করলে এগুলি কি আমার সিস্টেমকে প্রভাবিত করবে না $ পথ?
আন্তোনিও

এই আউটপুটটি বলে যে এটি কিছু ইমেল করার চেষ্টা করেছিল কিন্তু ব্যর্থ হয়েছিল। তার মানে, আপনি যে ত্রুটি বার্তাটি পাচ্ছেন না /var/mail/root। আপনি হয় তা ঠিক করতে পারেন, বা চেষ্টা করতে পারেনPATH=...
ওলি

@ অ্যান্টোনিও, বিকল্পভাবে, এই প্যাচ করা সংস্করণটি
ওলি

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

1
মাঝামাঝি সময়ে আমি মূল স্ক্রিপ্ট থেকে তারিখ বিন্যাসে একটি বাগ সংশোধন করতে ব্যস্ত ছিলাম। এটি% এম এর পরিবর্তে% মি (যা মাসের জন্য নয় মিনিটের জন্য) ব্যবহার
আন্তোনিও

0

আপনি আপনার স্ক্রিপ্টে এই লাইনটি যুক্ত করতে পারেন। সুতরাং আপনি ক্রোন লগগুলি পরীক্ষা করে পরীক্ষা করার পরে আপনার কাজটি কার্যকর করা হয়েছিল আপনি ক্রোনট্যাবগুলির একই $ প্যাথ পেতে পারেন।

/bin/echo $PATH > /root/path.txt

এবং সম্ভবত ক্রোন স্ক্রিপ্টগুলিতে সমস্যাগুলি নির্ণয়ের জন্য আপনি করতে পারেন সর্বোত্তম জিনিসটি হ'ল আপনার স্ক্রিপ্টে এনভি কমান্ড সহ এসও এর সমস্ত পরিবেশের পরিবর্তনশীল। সুতরাং আপনার স্ক্রিপ্টে এই লাইনটি যুক্ত করুন। তারপরে আপনি আউটপুট বিশ্লেষণ করতে পারেনallEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

অন্য কৌশলটি হ'ল স্ক্রিপ্টের আউটপুটকে কোনও স্থানে ডাইরেক্ট করা। যোগ করা হচ্ছে /root/log.log। এইভাবে স্ক্রিপ্টের সমস্ত আউটপুট বজায় রাখা হবে/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

এছাড়াও আপনি পরীক্ষা এবং চেকগুলির সুবিধার্থে প্রতিটি মিনিট চালনার জন্য স্ক্রিপ্টটি শিডিউল করতে পারেন।

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