Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: mrowcp в Sep 29, 2011, 16:44



Титла: bash script GET http://site.com
Публикувано от: mrowcp в Sep 29, 2011, 16:44
Направих един баш скрипт, който да следи, когато на http://site.com/up.txt се появи такъв файл ( up.txt ) да записва в /var/log/messages някакво съобщение.
Проблема е, че когато го сложа да се изпълнява в crontab-а, скрипт не сработва ( предполагам заради GET http://site.com/up.txt ), а при ръчно изпълнение всичко е ОК.
Ето скрипта:
Код
GeSHi (Bash):
  1. #!/bin/bash
  2. date=`date +"%d-%m-%Y"`
  3. GET http://site.com/up.txt > /root/scripts/webcheck.txt
  4. status=`grep $date /root/scripts/webcheck.txt | awk '{print $1}'`
  5.  
  6. if [ $date = $status ];then
  7. echo "Today $date file exist" >> /var/log/messages
  8. else
  9. echo "file missing"
  10. fi
  11.  

В лога на кронтаб-а всичко е ОК:

Код:
Sep 29 16:44:00 caph /usr/sbin/cron[82817]: (root) CMD ('/usr/local/bin/bash /root/scripts/upscheck.sh')

Ето и кронтаб-а:

Код:
*/2 * * * * '/usr/local/bin/bash /root/scripts/upscheck.sh'


Титла: Re: bash script GET http://site.com
Публикувано от: b2l в Sep 29, 2011, 16:52
Защо не смениш GET http://site.com/up.text с curl?


Титла: Re: bash script GET http://site.com
Публикувано от: borovaka в Sep 29, 2011, 16:54
//offtopic
@b2l Какво е това съкращение на ника? :)


Титла: Re: bash script GET http://site.com
Публикувано от: b2l в Sep 29, 2011, 16:57
//offtopic
@b2l Какво е това съкращение на ника? :)

backtolife


Титла: Re: bash script GET http://site.com
Публикувано от: bop_bop_mara в Sep 29, 2011, 16:58
//another offtopic
След като bash-а ти е /usr/local/bin/bash, защо #!/bin/bash? :)


//offtopic
@b2l Какво е това съкращение на ника? :)
Писна му от backtofile :D


Титла: Re: bash script GET http://site.com
Публикувано от: mrowcp в Sep 29, 2011, 17:01
Защо не смениш GET http://site.com/up.text с curl?

Хъм, как не се бях сетил... Стана, мерси ;)


Титла: Re: bash script GET http://site.com
Публикувано от: neter в Sep 30, 2011, 16:49
Проблема е, че когато го сложа да се изпълнява в crontab-а, скрипт не сработва ( предполагам заради GET http://site.com/up.txt ), а при ръчно изпълнение всичко е ОК.
Много лесно си се отказал от идеята си :) Може би единственото, което е трябвало да направиш за GET, е било да го впишеш с пълен път (най-вероятно /usr/bin/GET). Причината скриптът да се изпълнява ръчно, но не и в crontab е, че crontab не знае за променливите на средата (environment variables, виждат се с команда env) на твоя потребител, и докато в твоята променлива на средата PATH има зададен /usr/bin, то твоят crontab не знае за този път, където да търси GET, поради което не го намира.
За да избегнеш такива недоразумения в бъдеще, си изгради навика да вписваш пълни пътища към всичко (било инструменти, програми или други файлове) в скриптовете си (освен към инструментите в /bin и /sbin), когато пишеш скриптове за crontab. А и дори да не е за crontab, понякога пак може да ти спести главоболия. Въпрос на навик е ;)


Титла: Re: bash script GET http://site.com
Публикувано от: mrowcp в Oct 01, 2011, 02:45
Проблема е, че когато го сложа да се изпълнява в crontab-а, скрипт не сработва ( предполагам заради GET http://site.com/up.txt ), а при ръчно изпълнение всичко е ОК.
Много лесно си се отказал от идеята си :) Може би единственото, което е трябвало да направиш за GET, е било да го впишеш с пълен път (най-вероятно /usr/bin/GET). Причината скриптът да се изпълнява ръчно, но не и в crontab е, че crontab не знае за променливите на средата (environment variables, виждат се с команда env) на твоя потребител, и докато в твоята променлива на средата PATH има зададен /usr/bin, то твоят crontab не знае за този път, където да търси GET, поради което не го намира.
За да избегнеш такива недоразумения в бъдеще, си изгради навика да вписваш пълни пътища към всичко (било инструменти, програми или други файлове) в скриптовете си (освен към инструментите в /bin и /sbin), когато пишеш скриптове за crontab. А и дори да не е за crontab, понякога пак може да ти спести главоболия. Въпрос на навик е ;)

Мерси за съветите :) По принцип винаги описвам всяка команда с пълния път, защото и друг път съм го имал този проблем, но в случая... прибързано явно постнах проблема, а трябваше да огледам още малко.
Другото което се сещам, мисля че можеше в самия скрипт с env= да се опишат пътищата или се бъркам?


Титла: Re: bash script GET http://site.com
Публикувано от: romeo_ninov в Oct 01, 2011, 06:59
могат да се опишат по същия начин по който се присвояват променливи в скрипта
Код:
PATH=/usr/bin:/bin:/usr/local/bin
но може и много елегантно да си вземеш средата на шела
Код:
. /path/to/home/dir/.bashrc


Титла: Re: bash script GET http://site.com
Публикувано от: neter в Oct 01, 2011, 20:33
Другото което се сещам, мисля че можеше в самия скрипт с env= да се опишат пътищата или се бъркам?
В sh/ksh/bash става с
Код:
export ПРОМЕНЛИВА=СТОЙНОСТ

а в csh/tcsh
Код:
setenv ПРОМЕНЛИВА СТОЙНОСТ

Но не е добра практика да задаваш променливи на средата, когато целта не е именно работа с тези променливи - ако можеш да минеш и без тях, излишно пълниш средата, а може да се окаже и, че някой друг скрипт или приложение се чупи при новите стойности на променливите.
Основната идея на пълните пътища е да се освободиш от зависимостта други части на системата да ти определят основата на релативността, освен ако целта не е точно такава. В случая целта не е такава, и оставянето системата (в това число и други приложения) да ти определя основата или да изнасяш основата извън твоя скрипт може да доведе до главоболия. Целта е да намалим дупките, откъдето може да изскочат неочаквани проблемни зайци.
Дали ще опишеш пълните пътища с временно презаписване на променлива на системата (важащо само за скрипта) в стила на PATH, който ти е предложил romeo_ninov, или ще ги зададеш в отделни твои променливи, е въпрос на вкус - важното е да е направено. В кратки скриптове като твоя можеш да вписваш пълните пътища и директно там, където се ползват (без променливи), но за прегледността, а и винаги съществува вероятност скриптът да нарасне в даден момент, е хубаво да го избягваш - пак е въпрос на навик.
В този ред на мисли не съм съгласен с ползването на .bashrc, тъй като той също е външен за скрипта, и докато е много елегантно решение в комплексни ситуации, то за капсуловани скриптове като този пак може да доведе до проблеми. Но кой както се усеща сигурен.


Титла: Re: bash script GET http://site.com
Публикувано от: edmon в Oct 01, 2011, 22:58
мм извинявай , така проверяваш дали ти работи УЕб сървъра ли?


Титла: Re: bash script GET http://site.com
Публикувано от: romeo_ninov в Oct 02, 2011, 21:49
В sh/ksh/bash става с
Код:
export ПРОМЕНЛИВА=СТОЙНОСТ

...
Две корекции:
1, експорт на променливите се прави само ако искаме те да се предават на подщел,който ще стартираме от този
2. при sh не можее дновременно да се присвоистойност и променливата да се експортне.Прави се така:
Код:
VAR=value;export VAR 


Титла: Re: bash script GET http://site.com
Публикувано от: mrowcp в Oct 20, 2011, 05:23
мм извинявай , така проверяваш дали ти работи УЕб сървъра ли?

Ами... малко лемарско може да изглежда, но не се сетих за по... елегантен начин за следното:

Този скрипт се изпълнява през 2мин. на машина от локалната мрежа.Тази машина заедно с още една са закачени за един UPS.На 1вата машина при спиране на тока се генерира файл с някакъв текст и се копира някъде в www
Та този скрипт следи дали файла се е генерирал и ако да спира машината ( за да не се хабят батерии :) ).