ক্রোন যখন কোন কাজ সম্পাদন করে তখন 'ওয়ার্কিং ডিরেক্টরি' কী?


170

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা আমি কমান্ড লাইন থেকে চালানোর সময় কাজ করে, তবে যখন আমি এটির সাথে সময় নির্ধারণ করি তখন আমি cronত্রুটিগুলি পাই যা এটি ফাইল বা কমান্ড খুঁজে পায় না। আমার প্রশ্ন দ্বিগুণ:

  1. আমি যখন ক্রোন জব ব্যবহার করে শিডিউল করি, তখন crontab -eএটি কি আমার ব্যবহারকারীর আইডিটিকে তার অনুমতির ভিত্তি হিসাবে ব্যবহার করে? অথবা এটি কোনও ধরণের ক্রোন ব্যবহারকারী আইডি এবং এর সাথে সম্পর্কিত অনুমতি ব্যবহার করে?

  2. ক্রোন জব চালু করা হলে ওয়ার্কিং ডিরেক্টরি কী? এটি সেই ডিরেক্টরি যেখানে আমি স্ক্রিপ্টটি চালানোর জন্য নির্দিষ্ট করেছি, বা অন্য কোনও ডিরেক্টরি?

আমার ক্রোন কাজটি এখানে:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

আসল লিপিটি এখানে:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt

আমি mailউত্পাদিত বার্তাটি দেখার সময় আমার এখানে ত্রুটিগুলি রয়েছে cron:

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found

এটি সন্ধান করতে পারে না template.txtতবে এটি স্ক্রিপ্টের একই ডিরেক্টরিতে থাকে। এটি চলতে পারে না ssmtp, তবে আমি আমার ব্যবহারকারী হিসাবে পারি। এটি সঠিকভাবে কাজ করতে আমি কি অনুপস্থিত?

উত্তর:


158

cd /home/xxxx/Documents/Scripts/আপনি যদি আপনার কাজটি সেই ডিরেক্টরিতে চালিত করতে চান তবে যুক্ত করুন । ক্রোন যে নির্দিষ্ট ডিরেক্টরিতে পরিবর্তিত হবে তার কোনও কারণ নেই। ক্রোন আপনার হোম ডিরেক্টরিতে আপনার আদেশগুলি চালায়।

হিসাবে হিসাবে ssmtp, এটি আপনার ডিফল্ট নাও থাকতে পারে PATH। ক্রনের ডিফল্ট পাথ বাস্তবায়ন-নির্ভর, সুতরাং আপনার ম্যান পৃষ্ঠাটি পরীক্ষা করুন, তবে সমস্ত সম্ভাবনার ssmtpমধ্যে /usr/sbinযা আপনার ডিফল্ট নয় PATH, কেবল মূলের।

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

@ গাইলস - ধন্যবাদ, cronএর নিজস্ব কি আছে PATHবা আমি আমার ব্যবহারকারীর পরীক্ষা করতে পারি PATH? আমি ssmtp সেট আপ করেছি এটির নিজস্ব userএবং wheelঅনুমতি ভেবে যে এটি যে কেউ ব্যবহার করতে দেবে (ক্রোন সহ)। যদি এটি সেন্টোস 6.2 এ ইমকে সহায়তা করে
পেশাদার

3
@ প্রফেশনাল অ্যামেচার আপনার সমস্যাটি এটি নয় যে আপনাকে ব্যবহারের অনুমতি দেওয়া হচ্ছে না ssmtp, তবে আপনার ক্রোন জবটিতে কোনও এক্সিকিউটেবল নাম পাওয়া ssmtpযায়নি কারণ এটি আপনার মধ্যে নেই PATH। "আপনার ব্যবহারকারীর" এর মতো কোনও জিনিস নেই PATH; এটি প্রতি-প্রক্রিয়া সেটিং, প্রতি ব্যবহারকারী সেটিংস নয়। আপনি আপনার ক্রন্টবায় একটি PATH=…লাইন রেখে আপনার সমস্ত ক্রোন কাজের জন্য পথ নির্ধারণ করতে পারেন ।
গিলস

এটি প্যাথ সেটআপের সাথে কাজ করার জন্য আমাকে MAILTO='XXXX@gmail.com 'যুক্ত করতে হয়েছিল। Wierd কিন্তু এটি আমার জন্য কাজ করে।
ম্যাক

Ssmtp এর জন্য যে কেউ ব্যবহার করতে পারেন; ´which ssmtp´ ...
ফ্রেড্রিক গাউস

@ ফ্রেড্রিকগস এটি করুনtype ssmtp
গিলস

20

যদি আপনার ক্রোনজব বাশ স্ক্রিপ্ট হয় তবে নিম্নলিখিতটি আপনার স্ক্রিপ্টের অবস্থানের সিডি করবে (ধরে নিবেন যে আপনি আপনার ক্রোন সংজ্ঞাতে পরম পথ ব্যবহার করছেন):

cd "$(dirname "$0")";

14

প্রশ্নের 1 টির উত্তর দেওয়ার জন্য: আপনি যদি crontab -eনিজের ব্যবহারকারী হিসাবে চালিত হন তবে সেই ব্যবহারকারীর ক্রন্টবায় কাজগুলি নির্ধারিত হবে এবং এইভাবে সেই ব্যবহারকারীর অনুমতি নিয়ে চলবে।

তবে আপনার বিবেচনা করা দরকার যে কাজগুলি একটি অ-ইন্টারেক্টিভ শেলটিতে চলবে যার অর্থ হ'ল কমান্ড লাইন থেকে স্ক্রিপ্টটি চালানোর সময় have PATH আপনার থাকা চেয়ে আলাদা হতে পারে।

স্ক্রিপ্টগুলিতে সর্বদা সম্পূর্ণ পাথ ব্যবহার করা ভাল, বিশেষত যদি আপনি / ক্রোন ইত্যাদির মাধ্যমে সেগুলি নির্ধারণ করার পরিকল্পনা করেন if

আপনি যে সমস্যা দেখছেন তা এড়াতে আমি সমস্ত ফাইলের পুরো পথ ব্যবহার করার পরামর্শ দিচ্ছি।

জাতি শর্ত এবং অন্যান্য সুরক্ষা সমস্যা রোধ mktempকরতে আপনার পড়া ফাইলটি আপনার স্ক্রিপ্টের বাইরের কিছু দ্বারা সংশোধিত হয়নি তা নিশ্চিত করার জন্যও আপনাকে ব্যবহার করা উচিত ।

সুতরাং আমি স্ক্রিপ্টটি এমন কিছুতে পরিবর্তন করব:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cronপ্রতিটি ব্যবহারকারীর নির্ধারিত কাজগুলি সেই ব্যবহারকারী হিসাবে চালায়। এটি আপনার হোম ডিরেক্টরি সম্পর্কিত আপনার স্ক্রিপ্টগুলি চালায় তা আমাদের কাজ করার জন্য যথেষ্ট হতে হবে।

আপনার যদি অন্য কোনও স্থান থেকে চালানোর প্রয়োজন হয় তবে সেই cdস্ক্রিপ্টে কেবল সেই স্থানে যেতে ব্যবহার করুন ।

ssmtpসম্ভবত cronএটির ডিফল্ট পাঠে নেই (এটি বেশিরভাগ প্ল্যাটফর্মের নকশায় খুব সংকীর্ণ হবে)। হয় ssmtpআপনি আপনার স্ক্রিপ্টের পুরো পথটি নির্দিষ্ট করতে পারেন, বা আপনি স্পষ্টভাবে একটি PATH সেট করতে পারেন) আপনার ক্রন্টব ফাইল, যা আপনার সমস্ত স্ক্রিপ্টে উপলব্ধ হবে, বা খ) প্রতিটি স্ক্রিপ্টে।


3

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


1

ডিফল্ট জন্য কাজ ডিরেক্টরি cronকাজ নির্বাহ হোম ডিরেক্টরি, সাধারণত হয় /home/your-user-name

@ কুসালানন্দকে দুর্দান্ত মন্তব্যে গ্রহণ করা।


1
না। এটি নির্ভর করে যেখানে সিস্টেম হোম ডিরেক্টরি রাখে। /homeসর্বজনীন থেকে অনেক দূরে।
কুসালানন্দ

1
@ কুসালানন্দ এলএসবি স্ট্যান্ডার্ড বলছে /home
পিটারে

1
@ পেটার ওয়েল, ম্যাকোস ব্যবহার করে /Usersএবং historicalতিহাসিক ইউনিকসগুলি ব্যবহার করে /usrএবং লিনাক্সেও কোনও সিস্টেম ব্যবহারকারীর হোম ডিরেক্টরি কোথাও কোথাও /varবা অন্য কোথাও থাকতে পারে ।
কুসালানন্দ

1
@ কুসালানন্দ এটি সঠিক।
পিটারে

ধন্যবাদ, আপনি একমাত্র ব্যক্তি যিনি এই প্রশ্নের
উত্তরটি

0

কিছু লোক এটিতে ইঙ্গিত করেছে বা লিঙ্ক করেছে তবে এটি খুঁজে পাওয়ার সবচেয়ে ভাল উপায় যেহেতু আমি এটি আমার ডিসট্রোর জন্য ডক্সটিতে খুঁজে পাচ্ছি না কেবল এটি একটি ক্রোন যুক্ত করা হয়েছে

* * * * * echo $PATH > /tmp/lolcronjobs

আমার ক্ষেত্রে উবুন্টু কেবলমাত্র ব্যবহারের ক্ষেত্রে খেলাপি হয়েছে /usr/bin:/binযা কয়েকটি সমস্যা সৃষ্টি করেছিল।

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