أين يمكنني تعيين متغيرات البيئة التي سيستخدمها Crontab؟

StackOverflow https://stackoverflow.com/questions/2229825

سؤال

لدي 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 فار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top