ক্রোনটব যে পরিবেশের পরিবর্তনগুলি ব্যবহার করবে তা আমি কোথায় সেট করতে পারি?


266

আমি প্রতি ঘন্টা একটি ক্রন্টব চালাচ্ছি। এটি ব্যবহারকারী ব্যবহারকারীটির সেই পরিবেশে পরিবেশের পরিবর্তনশীল রয়েছে .bash_profileযখন ব্যবহারকারী টার্মিনাল থেকে কাজটি চালায় তবে স্পষ্টতই এগুলি ক্রন্টাব দ্বারা চালিত হয় না যখন এটি চলবে।

আমি সেগুলি স্থাপন করার চেষ্টা করেছি .profileএবং .bashrcতারা এখনও উঠবে বলে মনে হয় না। কেউ কি জানেন যে আমি কোথায় পরিবেশের ভারগুলি রাখতে পারি যা ক্রন্টাব তুলতে পারে?

উত্তর:


88

'ক্রোন' শেল স্ক্রিপ্ট চালান যা কমান্ড চালানোর আগে পরিবেশ নির্ধারণ করে।

সর্বদা.

#   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
#   Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min     Hour    Day     Month   Weekday Command
#-----------------------------------------------------------------------------
0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly

~ / বিন / ক্রোন-এর স্ক্রিপ্টগুলি সমস্ত একক স্ক্রিপ্ট, 'রানক্রন' -র লিঙ্ক, যা দেখে মনে হচ্ছে:

:       "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
#       Commands to be performed by Cron (no debugging options)

#       Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile

base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base

if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi

exec $cmd ${@:+"$@"}

(একটি পুরানো কোডিং স্ট্যান্ডার্ড ব্যবহার করে লেখা - আজকাল, আমি শুরুতে একটি শেবাং '#!' ব্যবহার করব।)

'~ / .Cronfile' ক্রোন দ্বারা ব্যবহারের জন্য আমার প্রোফাইলের একটি প্রকরণ - কঠোরভাবে অ-ইন্টারেক্টিভ এবং শোরগোলের স্বার্থে প্রতিধ্বনিত হয় না। আপনি তার পরিবর্তে। প্রোফাইল ইত্যাদি চালানোর ব্যবস্থা করতে পারেন। (সত্যিকারের জিনিসগুলি আমার পরিবেশের একটি প্রত্নক্ষেত্র - আপনি এটি $ হোমের মতোই ভান করতে পারেন))

সুতরাং, এই কোডটি উপযুক্ত পরিবেশটি পড়ে এবং তারপরে আমার হোম ডিরেক্টরি থেকে কমান্ডের নন-ক্রোন সংস্করণ কার্যকর করে। সুতরাং, উদাহরণস্বরূপ, আমার 'সপ্তাহের দিন' কমান্ডটি দেখতে:

:       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
#       Commands to be done each weekday

# Update ICSCOPE
n.updics

'দৈনিক' আদেশটি সহজ:

:       "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
#       Commands to be done daily

# Nothing -- most things are done on weekdays only

exit 0

246

crontab -eকমান্ড লাইন থেকে চলাকালীন আপনি নিজেই ক্রোনটবে পরিবেশ পরিবর্তনশীল নির্ধারণ করতে পারেন ।

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

এই বৈশিষ্ট্যটি ক্রোনটির নির্দিষ্ট কিছু বাস্তবায়নের জন্য উপলভ্য। উবুন্টু এবং ডেবিয়ান বর্তমানে ভিক্সি-ক্রোন ব্যবহার করে যা এগুলি ক্রন্টব ফাইল (জিএনইউ ম্যাক্রোন ) এ ঘোষণার অনুমতি দেয় ।

Archlinux এবং তাহলে RedHat ব্যবহার cronie যা নেই এনভায়রনমেন্ট ভেরিয়েবল ঘোষণা করা মঞ্জুর এবং cron.log মধ্যে সিনট্যাক্স ত্রুটি নিক্ষেপ করা হবে। প্রতি প্রবেশে ওয়ার্কআরাউন্ড করা যেতে পারে:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"

58
নোট করুন যে আপনি শেলের মতো পরিবর্তনশীল প্রতিস্থাপন ব্যবহার করতে পারবেন না, সুতরাং PATH = / usr / স্থানীয় / বিনের মতো একটি ঘোষণা: AT PATH আক্ষরিক অর্থে ব্যাখ্যা করা হয়।
জ্যাক

8
আমি রেডহ্যাট ৪.৪..7-৩ এবং ক্রোনি -১.৪.৪-১৫.el6.x86_64
ব্রুনো ল্যাঞ্জ

7
আপনার যদি ভেরিয়েবলগুলি কেবল কমান্ডের মধ্যে ব্যবহার করা হয় তবে আপনার কমান্ডের আগে এগুলি প্রিপেন্ড করুন vari "* * * * * ঘুম 5s; এলসি_এলএল = nb_NO.UTF-8 প্রতিধ্বনি $
এলসি_এল


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

145

আমি এই সমস্যার আরও একটি সমাধান পেয়েছি:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

এই ক্ষেত্রে এটি আপনার $HOME/.profileফাইলে সংজ্ঞায়িত সমস্ত পরিবেশের পরিবর্তনশীল চয়ন করবে ।

অবশ্যই $HOMEসেট করা নেই, আপনাকে এটির পুরো পথ দিয়ে এটি প্রতিস্থাপন করতে হবে $HOME


উত্তরটি খুঁজে পেতে অনেক লড়াই করার পরে এটি আমার পক্ষে কাজ করেছিল, ধন্যবাদ!
ভ্লাদিমির মন্টেলেগ্রে

5
এটি আমার পক্ষে কাজ করছে না যতক্ষণ না আমি বুঝতে পেরেছিলাম যে আমি OME হোমের আগের সময়টি বাদ দিয়েছি। ঠিক কি, এই সময়কালে কি করে?
ফ্লাইমাইক

9
সময়কালটি "উত্স" কমান্ডের সমতুল্য: tldp.org/LDP/abs/html/sp Special
জেফ ডব্লিউ

@ পিটারলাই কি উল্লেখ করা কিছু আপনার জন্য কাজ করে? আমি এটি লিখেছিলাম কারণ উল্লিখিত সমাধানগুলি আমার পক্ষে কার্যকর ছিল না। যদি উপরে উল্লিখিত সমাধানটি কাজ না করে, কারণ খুঁজে পেতে আমাকে কিছু গবেষণা করতে হবে। ;-)
বিশাল

3
@ বিশাল আসলে এটি এখন আমার পক্ষে কাজ করে। আমি চেষ্টা করছিলাম source ~/.bashrc, এবং দেখা যাচ্ছে যে আমার .bashrcফাইল ক্রোন কাজের সাথে বাছাইয়ের। আমি যদি .env_setup_rcকেবল একটি লাইন সহ খুব সাধারণ ফাইলটি ব্যবহার export MY_ENV_VAR=my_env_valকরি:, এটি আসলে কাজ করে। আমার পোস্ট দেখুন: স্ট্যাকওভারফ্লো
পিটার লি

62

ভার সেট করা /etc/environmentউবুন্টুতেও আমার পক্ষে কাজ করেছিল। 12.04 পর্যন্ত, ভেরিয়েবলগুলি ক্রোনের /etc/environmentজন্য লোড করা হয়।


11
সেরা উত্তর, স্রেফ এক্সিকিউট করুন env >> /etc/environmentএবং সমস্ত বর্তমান এনভির ভার্স এখন সিআরএন চাকরিতে উপলব্ধ।
সেভেজম্যান

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

14
@ সাভেজম্যান যেটি ফিউশন বোমা দিয়ে মাছি মারার মতো, অপ্রত্যাশিত আচরণের ঝুঁকিও এটি খুব বেশি।
ফ্রান মারজোয়া

2
সাবধান থাকুন: env >> /etc/environmentপরিবেশের ভেরিয়েবলগুলির মধ্যে একটিতে হ্যাশ সাইন থাকলে ব্যর্থ হবে। আমার অ্যাপ্লিকেশনটির সমস্যা সমাধানের জন্য আমার সবচেয়ে কঠিন সময় ছিল। এটি '#' সম্বলিত একটি পাসওয়ার্ড হিসাবে দেখা গেছে যা সেই পদক্ষেপে ছিন্ন হয়ে গিয়েছিল।
asac

3
এটি নির্বাচিত উত্তর হওয়া উচিত। আমি জানি না কেন লোকেরা অন্যান্য উত্তরগুলির সাথে বা এনভ >> >> ইত্যাদি / পরিবেশ সম্পর্কে এই স্টাফের সাথে জিনিসগুলিকে জটিল করছে। আপনি যদি এই এনভ ভার্সগুলি সর্বজনীনভাবে উপলভ্য করতে চান তবে কেবল ভালভাবে সম্পাদনা ইত্যাদি / পরিবেশের জ্বলজ্বলে: আমার পরীক্ষাগুলি নিশ্চিত করে মনে হচ্ছে যে / ইত্যাদি / এনভায়রনমেন্টে এনভ ভার্সের রফতানি বিবৃতি ক্রন্টব্যাব এবং ব্যবহারকারীদের জন্য উপলব্ধ। সমস্যা: আবার আমার পরীক্ষাগুলি থেকে: মনে হচ্ছে যে এই এনভ ভার্সগুলি ক্রোনটাবের মধ্যেই বাড়ানো হয়নি! ... অর্থাৎ এগুলি কেবলমাত্র লিখিত স্ক্রিপ্টগুলিতে প্রসারিত হয়!
মাইকে রডেন্ট

39

আপনি যদি স্ক্রিপ্টগুলি শুরু করেন তবে ক্রোনটির মাধ্যমে এটি প্রয়োগ করছেন:

#!/bin/bash -l

তাদের আপনার ~/.bash_profileপরিবেশের পরিবর্তনশীলগুলি গ্রহণ করা উচিত


4
এই উত্তরটি আরও বেশি পরিমাণে পাওয়া উচিত এবং কেবলমাত্র নির্বাচিত উত্তর হওয়া উচিত: খুব সহজ এবং মার্জিত এবং এমন অসংখ্য কুলেজ এড়িয়ে চলা উচিত যা সমস্ত সিস্টেমে ঝাঁপিয়ে পড়তে হবে।
জেকগল্ড

আমি এই উত্তরটি +1 পছন্দ করি। rootক্রন্টব চালানোর সময় কি এটি ব্যবহার করা উচিত ? /home/rootআমার সিস্টেমে কোনও ফোল্ডার নেই এবং তাই আমি দেখতে পাচ্ছি না এটি কীভাবে rootক্রন্টাবের সাথে কাজ করবে । ধারনা?
Seamus

লিপি নিজেই। যা আপনি সাধারণত ক্রোন দিয়ে চালান।
breizhmg

@ জিম এই উদাহরণটি দেখুন , ক্লাসিক এক্সিকিউটেবল ফাইল (chmod 777) ব্যবহার #!/bin/bash। এখানে -l
যাদুটি

22

@ ক্রেস্টেড উদাহরণে প্রসারিত করা, যা আমি সহজ মনে করি তা হল ক্রোন দিয়ে স্ক্রিপ্টটি চালানো এবং স্ক্রিপ্টে পরিবেশ থাকা।

ক্রন্টব-ফাইলটিতে:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh

ক্রোন_জব.এস ফাইলে:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

.বাশ_প্রফাইলে উত্সের পরে যে কোনও কমান্ডের এমন পরিবেশ থাকবে যেমন আপনি লগ ইন করেছেন।


16

আমার জন্য আমাকে পিএইচপি অ্যাপ্লিকেশনটির জন্য পরিবেশের পরিবর্তনশীল সেট করতে হয়েছিল। আমি আমার ক্রন্টবায় নিম্নলিখিত কোড যুক্ত করে এটি পুনরায় চালু করেছি।

$ sudo  crontab -e

নিম্নলিখিতরূপে crontab পরিবর্তন:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

এবং doSomethingWonderful.php এর অভ্যন্তরে আমি পরিবেশ মূল্যটি এর সাথে পেতে পারি:

<?php     
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"

আশা করি এটা কাজে লাগবে!


এটি আমার পক্ষে কাজ করে না। ক্রন্টবের অভ্যন্তরে লিখিত স্ক্রিপ্টটিতে পরিবেশের পরিবর্তনশীল উপলব্ধ ছিল না।
নিখিল

12

আপনি যা কিছু সেট crontabকরেছেন তা সরাসরি এবং স্ক্রিপ্টগুলিতে ভেরিয়েবলগুলি ব্যবহার করে ক্রোনজবগুলিতে উপলব্ধ।

ক্রোনজব সংজ্ঞা হিসাবে তাদের ব্যবহার করুন

আপনি কনফিগার করতে পারেন crontabযাতে এটি ভেরিয়েবল সেট করে যা ক্রোনজব ব্যবহার করতে পারে:

$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello

এখন ফাইলটি এই জাতীয় /tmp/helloজিনিস দেখায়:

$ cat /tmp/hello 
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016

এগুলি ক্রোনজব দ্বারা চালিত স্ক্রিপ্টে ব্যবহার করুন

আপনি কনফিগার করতে পারেন crontabযাতে এটি ভেরিয়েবল সেট করে যা স্ক্রিপ্টগুলি ব্যবহার করতে পারে:

$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh

এবং বলুন স্ক্রিপ্টটি /tmp/myscript.shএরকম:

echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res

এটি একটি ফাইল /tmp/myoutput.resদেখায় যা উত্পন্ন করে :

$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...

7

@ রবার্টে সম্প্রসারিত ব্রিসিটা কেবল প্রসারিত হয়েছে, এছাড়াও আপনি যদি স্ক্রিপ্টে প্রোফাইলের সমস্ত ভেরিয়েবল সেট আপ করতে না চান তবে আপনি স্ক্রিপ্টের শীর্ষে রফতানি করতে ভেরিয়েবলগুলি নির্বাচন করতে পারেন

ক্রন্টব-ফাইলটিতে:

SHELL=/bin/bash

*/1 * * * * /Path/to/script/script.sh

স্ক্রিপ্ট.শ এ

#!/bin/bash
export JAVA_HOME=/path/to/jdk

some-other-command

7

পরিবর্তে

0  *  *  *  *  sh /my/script.sh

Bash -l -c ব্যবহার করুন

0  *  *  *  *  bash -l -c 'sh /my/script.sh'

1
কেন শুধু ফাইল উপরের ব্যাশ ঘোষণা থাকার পরিবর্তে এই কাজ -lভালো: #!/bin/bash -l? এই অন্যান্য উত্তর সহজ এবং মার্জিত।
জেকগল্ড

1
আমার যদি পার্ল / পাইথন / রুবি স্ক্রিপ্টটি বাশ না চালানো দরকার? আমি পাইথন স্ক্রিপ্টের শীর্ষে #! / Bin / bash -l যুক্ত করতে পারি না।
ইলিয়া খারলামভ

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

3

আমি Oh-my-zshআমার ম্যাকবুকটিতে ব্যবহার করছি তাই ক্রন্টব টাস্কটি চালানোর জন্য আমি অনেক কিছুই চেষ্টা করেছি তবে শেষ পর্যন্ত, আমার সমাধানটি .zshrcকমান্ড চালানোর আগে প্রস্তুতি নিচ্ছিল ।

*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js

এই টাস্কটি প্রতি 30 মিনিটে চলে এবং .zshrcআমার নোড কমান্ডটি কার্যকর করতে প্রোফাইল ব্যবহার করে ।

ভেরের আগে বিন্দুটি ব্যবহার করতে ভুলবেন না $HOME


2

আর একটি উপায় - এই উত্তরে অনুপ্রাণিত - "ইনজেক্ট" ভেরিয়েবলগুলি নিম্নলিখিত (fcron উদাহরণ):

%daily 00 12 \
    set -a; \
    . /path/to/file/containing/vars; \
    set +a; \
    /path/to/script/using/vars

থেকে help set:

- একটি পরিবর্তনশীল চিহ্নিত করুন যা রফতানির জন্য পরিবর্তিত বা তৈরি করা হয়েছে।

পরিবর্তে + ব্যবহার করা - এর ফলে এই পতাকাগুলি বন্ধ হয়ে যায়।

সবকিছু তাই মাঝে set -এবং set +রপ্তানি করা পরার envএবং ব্যবহার না করেই তারপর অন্যান্য স্ক্রিপ্ট, ইত্যাদি জন্য উপলব্ধ setভেরিয়েবল sourced পেতে কিন্তু লাইভset শুধুমাত্র।

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

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck

2

আমি প্রদত্ত বেশিরভাগ সমাধানের চেষ্টা করেছি, তবে প্রথমে কিছুই কার্যকর হয়নি। এটি প্রমাণিত হয়েছে, এটি কার্যকর হয়নি যে সমাধানগুলি ছিল না। স্পষ্টতই, আমার ~/.bashrcফাইলটি নিম্নলিখিত কোডের ব্লক দিয়ে শুরু হয়:

case $- in
    *i*) ;;
    *) return;;
esac

এটি মূলত একটি case statementযা শেলটি ইন্টারেক্টিভভাবে চলছে কিনা তা নির্ধারণ করতে বর্তমান শেলের বিকল্পগুলির বর্তমান সেটটি পরীক্ষা করে। শেলটি যদি ইন্টারঅ্যাকটিভভাবে চলতে থাকে, তবে এটি ~/.bashrcফাইলটি সোর্সিংয়ের দিকে এগিয়ে যায় । যাইহোক, দ্বারা চালিত একটি শেলের মধ্যে cron, $-ভেরিয়েবলের মধ্যে iমানটি থাকে না যা ইন্টারঅ্যাক্টিভিটি নির্দেশ করে। অতএব, ~/.bashrcফাইলটি সম্পূর্ণরূপে উত্সাহিত হয় না। ফলস্বরূপ, পরিবেশের ভেরিয়েবলগুলি সেট হয়ে যায় নি। যদি এটি আপনার সমস্যা হয়ে থাকে তবে নীচের মত কোডের ব্লকটি সম্পর্কে বিনা দ্বিধায় মন্তব্য করুন এবং আবার চেষ্টা করুন:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

আমি আশা করি এটি কার্যকর হবে


0

আপনি envযেমন পরিবেশ ভেরিয়েবলগুলি ইনজেক্ট করার জন্য আপনার কমান্ডটিও প্রেন্ডেন্ড করতে পারেন:

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