أين يمكنني تعيين متغيرات البيئة التي سيستخدمها Crontab؟
-
19-09-2019 - |
سؤال
لدي Crontab تشغيل كل ساعة. المستخدم الذي يعمل له البغيض البيئي في .bash_profile
هذا العمل عندما يقوم المستخدم بتشغيل المهمة من المحطة، ومع ذلك، من الواضح أن هذه لا تحصل على التقاط بواسطة Crontab عندما يعمل.
لقد حاولت تحديدها .profile
و .bashrc
لكنهم لا يزالون لا يبدو أن الحصول على التقاط. هل يعرف أحد أين يمكنني وضع البيئة Vars التي يمكن أن تلتقطها crontab؟
المحلول
يكون "Cron" تشغيل برنامج نصي شل يقوم بتعيين البيئة قبل تشغيل الأمر.
دائما.
# @(#)$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
النصوص الموجودة في ~ / bin / cron هي جميع الروابط إلى برنامج نصي واحد، "Runcron"، والتي تبدو وكأنها:
: "$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 ${@:+"$@"}
(مكتوبة باستخدام معيار ترميز أقدم - في الوقت الحاضر، أود استخدام Shebang "#!" في البداية.)
يعد "~ / .cronfile" تباين في ملف التعريف الخاص بي للاستخدام من قبل Cron - بصرامة غير تفاعلية ولا يرددا من أجل أن تكون صاخبة. يمكنك ترتيب لتنفيذ .profile وما إلى ذلك بدلا من ذلك. (الاشياء Real_home هي قطعة أثرية بيئتي - يمكنك التظاهر بأنها هي نفسها في المنزل.)
لذلك، يقرأ هذا الرمز البيئة المناسبة ثم ينفذ إصدار غير كرون من الأمر من دليل منزلي. لذلك، على سبيل المثال، يشبه الأمر "أيام الأسبوع"
: "@(#)$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
نصائح أخرى
يمكنك تحديد متغيرات البيئة في Crontab نفسه عند التشغيل crontab -e
من سطر الأوامر.
LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h dom mon dow command
* * * * * sleep 5s && echo "yo"
هذه الميزة متاحة فقط لتطبيقات معينة من Cron. Ubuntu والبيان يستخدمون حاليا vixie-cron. الذي يسمح لهذه المعلن به في ملف Crontab (GNU أيضا mcron.).
Archlinux. و قبعة حمراء استعمال كروني أي لا السماح بإعلال متغيرات البيئة وسيقوم بإلقاء أخطاء بناء الجملة في Cron.log. يمكن القيام بالعمل في الإدخال:
# m h dom mon dow command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
حصلت على حل آخر لهذه المشكلة:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
في هذه الحالة، ستختار جميع متغير البيئة المحدد في حياتك $HOME/.profile
ملف.
بالطبع بكل تأكيد $HOME
لم يتم تعيين أيضا، يجب عليك استبداله بالمسار الكامل الخاص بك $HOME
.
الإعداد فارس في /etc/environment
عملت أيضا بالنسبة لي في أوبونتو. اعتبارا من 12.04، المتغيرات في /etc/environment
يتم تحميلها للكرون.
التوسع على مثال Carestad، الذي أجده أسهل، هو تشغيل البرنامج النصي مع كرون ولديه البيئة في البرنامج النصي.
في ملف Crontab -e:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
في ملف cron_job.sh:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
أي أمر بعد مصدر .Bash_profile سيكون بيئتك كما لو قمت بتسجيل الدخول.
إذا قمت ببدء تشغيل البرامج النصية التي تقوم بتنفيذها عبر Cron مع:
#!/bin/bash -l
يجب أن تلتقط الخاص بك ~/.bash_profile
متغيرات البيئة
بالنسبة لي اضطررت لتعيين متغير البيئة لتطبيق PHP. لقد استدعاءها عن طريق إضافة التعليمات البرمجية التالية إلى Crontab.
$ sudo crontab -e
Crontab:
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
وداخل dosomethingwonderfulfulful.pp يمكنني الحصول على قيمة البيئة مع:
<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
آمل أن يساعد هذا!
كل ما وضعت في crontab
ستكون متاحة في CRONJOBS، سواء مباشرة واستخدام المتغيرات في البرامج النصية.
استخدامها في تعريف كرونجوب
يمكنك تكوين crontab
بحيث يحدد المتغيرات التي تستخدمها Can Cronjob:
$ 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
استخدمها في البرنامج النصي الذي يديره Cronjob
يمكنك تكوين 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
...
بدلا من
0 * * * * sh /my/script.sh
استخدام bash -l -c
0 * * * * bash -l -c 'sh /my/script.sh'
تتوسع التوسع في Robert Brisita توسيع فقط، أيضا إذا كنت لا ترغب في إعداد جميع متغيرات الملف الشخصي في البرنامج النصي، يمكنك تحديد المتغيرات للتصدير في الجزء العلوي من البرنامج النصي
في ملف Crontab -e:
SHELL=/bin/bash
*/1 * * * * /Path/to/script/script.sh
في script.sh.
#!/bin/bash
export JAVA_HOME=/path/to/jdk
some-other-command
طريقة أخرى - مستوحاة من هذا هذه الإجابة - إلى "حقن" المتغيرات هي ما يلي (مثال Fcron):
%daily 00 12 \
set -a; \
. /path/to/file/containing/vars; \
set +a; \
/path/to/script/using/vars
من help set
:
-a مارك المتغيرات التي يتم تعديلها أو تم إنشاؤها للتصدير.
باستخدام + بدلا من - يؤدي إلى إيقاف تشغيل هذه الأعلام.
لذلك كل شيء بين set -
و set +
يحصل تصديرها إلى env
ثم متاح للبرامج النصية الأخرى، وما إلى ذلك دون استخدام set
المتغيرات الحصول على مصادر ولكن العيش في set
فقط.
بصرف النظر عن أنه من المفيد أيضا تمرير المتغيرات عندما يتطلب البرنامج حساب غير جذر أن يعمل لكنك تحتاج إلى بعض المتغيرات داخل بيئة المستخدم الأخرى. فيما يلي مثال يمر في Nullmailer Vars لتنسيق رأس البريد الإلكتروني:
su -s /bin/bash -c "set -a; \
. /path/to/nullmailer-vars; \
set +a; \
/usr/sbin/logcheck" logcheck
جربت معظم الحلول المقدمة، لكن لا شيء يعمل في البداية. اتضح، على الرغم من أنه لم يكن الحلول التي فشلت في العمل. على ما يبدو، بلدي ~/.bashrc
يبدأ الملف مع كتلة الرمز التالية:
case $- in
*i*) ;;
*) return;;
esac
هذا أساسا هو case statement
يتحقق هذا المجموعة الحالية من الخيارات في Shell الحالية لتحديد أن Shell يعمل بشكل تفاعلي. إذا حدثت شل قيد التشغيل بشكل تفاعلي، فانتقل إلى مصادر ~/.bashrc
ملف. ومع ذلك، في قذيفة استدعاء من قبل cron
, ، ال $-
متغير لا يحتوي على i
القيمة التي تشير إلى التفاعل. لذلك، ~/.bashrc
الملف لا يحصل فقط على المصادر بالكامل. نتيجة لذلك، لم تحصل متغيرات البيئة أبدا على مجموعة. إذا حدث ذلك مشكلتك، فلا تتردد في التعليق على كتلة التعليمات البرمجية على النحو التالي والمحاولة مرة أخرى:
# case $- in
# *i*) ;;
# *) return;;
# esac
آمل أن يتحول هذا مفيدا
أنا استخدم Oh-my-zsh
في My Macbook، لقد جربت أشياء كثيرة للحصول على مهام Crontab، وأخيرا، كان حلاي بإعداد .zshrc
قبل القيادة.
*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js
تعمل هذه المهمة كل 30 دقيقة واستخدامها .zshrc
الملف الشخصي لتنفيذ أمر عقدة الخاص بي.
لا تنس استخدام نقطة قبل $HOME
فار.