Титла: Странен проблем с shell script Публикувано от: Ali Nebi в Jun 16, 2014, 22:25 Здравейте,
имам много странен проблем с шел скипт и ще се радвам на вашата помощ. Идеята е следната - имам инит главен инит скрипт, който извиква допълнителни инит скриптове в един цикъл, за да пусне съответните приложения. Пример: Код: for INIT in $(ls $INIT_DIR); do Проблемът, който се появява е следният. В скриптовете, които се извикват в цикъла имам return и exit в зависимост от това коя част се изпълнява в процеса на извикване. При първата итерация първият скрипт се изпълнява и цикълът приключва, което не е правилно, защото в самата директория има и други скриптове - ls ги връща. Потествах малко и се оказа, че проблемът се получава от return и exit редовете в скрипта и поради някаква причина това причинява изход от цикъла. Ще се радвам ако ми дадете идеи къде евентуално бъркам. Между другото ако си ги пускам инит скриптовете на приложенията ръчно през терминала, то те си работят без проблем. Благодаря предварително! Титла: Re: Странен проблем с shell script Публикувано от: neter в Jun 16, 2014, 22:35 Налага се да бъдеш по-подробен в показването на код от скрипта. Информацията, която си предоставил дотук, изисква познания по мистични науки, за да се разбере цялата картинка ;)
Титла: Re: Странен проблем с shell script Публикувано от: Ali Nebi в Jun 16, 2014, 22:48 Извинявам се за това и благодаря за преместването на темата в правилната категория.
Имам един init script в /etc/init.d/javapps.sh който ще се стартира при старт на сървъра. Идеята вътре в него да извиквам старт скриптове на няколко liferay инсталации (томкат), чиито инит скриптове се намират в /var/www/javapps/init.d/enabled директорията. Главният инит скрипт има следния код: Код: #!/bin/bash -e Това е кодът на един от инит скриптовете (всички останали са много подобни на този), който се извикват от този /etc/init.d/javapps.sh във for цикъла: Код: #!/bin/bash -e В главният скрипт, който е предназначен да се пуска при старт на сървъра, има FOR цикъл, но спира веднага след първата итерация, без значение колко скрипта има в директорията, където се намира. Титла: Re: Странен проблем с shell script Публикувано от: neter в Jun 17, 2014, 10:25 Не съм стигнал да огледам подробно втория скрипт, но в първия на първо четене виждам 2 грешки:
1. В start() функцията си сложил изпълнение на скриптовете със status параметър. Не е това проблемът, заради който питаш, но да кажа; 2. При така организираните шелове променливата $INIT_DIR остава недефинирана във for циклите, при което се листват файловете не в очакваната "/var/www/javapps/init.d/enabled", а в директорията, от която скриптът се изпълнява. Това със сигурност е проблем за очакваното изпълнение на скрипта, а в определени ситуации може да доведе и до точния проблем, който се проявява при теб. За да бъде четимо съдържанието на променливата $INIT_DIR от for циклите в текущата организация може да опишеш тези редове така Цитат su -s /bin/bash -c 'for INIT in $(ls '$INIT_DIR'); do '$INIT_DIR'/$INIT status; done' $USER >/dev/nullОбърни внимание, че кавичките са станали единични и са добавени нови! Оправи тези два проблема, виж как е и ще го мислим нататък, ако все още имаш проблем! Титла: Re: Странен проблем с shell script Публикувано от: Ali Nebi в Jun 17, 2014, 11:33 Здравей,
Благодаря ти за бързия отговор и за помощта. Направих нужните промени, както ме посъветва и сега всичко работи правилно. Не очаквах, че INIT_DIR ще бъде недефинирана по начина по който го бях писал - научих нещо ново. :) Предполагам, че ако се сложи export пред дефиницията на INIT_DIR, то тогава ще е видима, дори и без промяна и добавка на кавичките (разбира се това не е добра идея, но пусто любопитство :) ). Благодаря още веднъж neter и успешен ден! Титла: Re: Странен проблем с shell script Публикувано от: neter в Jun 17, 2014, 13:49 Предполагам, че ако се сложи export пред дефиницията на INIT_DIR, то тогава ще е видима, дори и без промяна и добавка на кавичкитеМоже и така - в случая не се съдържа чувствителна информация в нея, което да понижи по някакъв начин сигурността. Само не забравяй после да unset-неш променливата, защото ще си остане излишно в средата и след края на изпълнението на скрипта. Имай предвид обаче, че това ще ти спести добавените нови два чифта кавички, но все още се налага основните кавички да бъдат единични, тъй като при двойни това, което излиза от командата ls, ще бъде възприемано като параметри, а не като текст, който да използваш в структурата на имената след това. Иначе, аз на твое място бих изкарал променливата $INIT_DIR извън тези редове и бих заменил for-овете с while. Например: Цитат cd "$INIT_DIR"Този вариант като цяло ти решава и още един проблем - евентуални интервали в имената на папката и файловете. Първата команда е най-добре да отиде точно под задаването на стойността на $INIT_DIR. Успех и на теб ;) |