Сразу извеняюсь если не правильно выражаюсь есть такая проблемка, написал Bash скриптик который раз в 5 минут проверяет DICOM запросы от программы, если нет ответа запускает службу рестарт сервиса если 3 раза не получается то в перезагрузку CENTOS.Всё прекрасно работает в терминале, но вот я хотел проверить это скрипт загрузить в авто загрузку.
как только прописал в rc.local и перезагрузил то система виснет на обработке скрипта и всё думаю из-за того что в скрипте есть петля(((Но на самом деле мне нужно этот скрипт запускать как службу
Можно ли мне мой скрипт запустить как службу?
Пытался сделать как написано тут
http://www.opennet.me/base/sys/run_services_tips.txt.html но не получается запустить
он мне выдает состояние в списках служб
env: /etc/init.d/restartd: No such file directoryесли запустить в терминале
bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога
Но он то там есть)))
#!/bin/sh
# chkconfig: - 98 02
# description: DCM
# processname: restartd# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
KIND="Restard"
start() {
echo -n $"Starting $KIND services: "
daemon /usr/local/sbin/restart
echo
}stop() {
echo -n $"Shutting down $KIND services: "
killproc restart
echo
}restart() {
echo -n $"Restarting $KIND services: "
killproc restart
daemon /usr/local/sbin/restart
echo
}case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
Помогите плиз кто чем может хоть ссылкой на какой нить пример погибаю, заранее спсибо.
>bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога
>
>Но он то там есть)))Во-первых, где "там" указан именно [b]bin/bash[/b]? Что-то я нигде такой строчки не обнаружил...
Во-вторых, если он "там" все-таки есть, то не следовало ли указать полный путь: [b][u]_/[/u]bin/bash[/b]?
В-третьих, "^M" ненавязчиво намекает на то, что было бы неплохо файлы, отредактированные
в Windows, привести в человеческий вид с помощью, например, [b]dos2unix[/b], [b]fromdos[/b] или [b]d2u[b].
>[оверквотинг удален]
>>Но он то там есть)))
>
>Во-первых, где "там" указан именно [b]bin/bash[/b]? Что-то я нигде такой строчки не
>обнаружил...
>Во-вторых, если он "там" все-таки есть, то не следовало ли указать полный
>путь: [b][u]_/[/u]bin/bash[/b]?
>В-третьих, "^M" ненавязчиво намекает на то, что было бы неплохо файлы, отредактированные
>
>в Windows, привести в человеческий вид с помощью, например, [b]dos2unix[/b], [b]fromdos[/b] или
>[b]d2u[b].bash я поменял не помагло, у меня есть только bash скрипт и мне нужно его запустить как службу) win файлов у меня нет.
может у кого пример есть скрипта запуска службы?
>может у кого пример есть скрипта запуска службы?У вас их в /etc/init.d полно.
>>может у кого пример есть скрипта запуска службы?
>
>У вас их в /etc/init.d полно.вот наверху пример и вроде все правильно, но не работает.
>вот наверху пример и вроде все правильно, но не работает.В таком случае запустите его руками и [u]процитируйте[/u] сообщения, которые будут выданы на экран.
Именно процитируйте (методом "скопировать-вставить"), а не пересказывайте своими словами. Кстати,
я, если честно, так толком и не понял, как называется ваша служба: "restart", "restard" или "restartd". :-)P. S. Да, и что из себя представляет /usr/local/sbin/restart? Если обычный скрипт, приведите здесь его.
>>вот наверху пример и вроде все правильно, но не работает.
>
>В таком случае запустите его руками и [u]процитируйте[/u] сообщения, которые будут выданы
>на экран.
>Именно процитируйте (методом "скопировать-вставить"), а не пересказывайте своими словами. Кстати,
>я, если честно, так толком и не понял, как называется ваша служба:
>"restart", "restard" или "restartd". :-)
>
>P. S. Да, и что из себя представляет /usr/local/sbin/restart? Если обычный скрипт,
>приведите здесь его.и так
у меня есть скрипт вот он и имеет название restart
#!/bin/bash
prov() {
/bin/echoscu -aec CONQUESTSRV1 192.168.1.2 5678 -v -to 5
label=$?
if [ "$label" = 0 ]; then
pin
else
/bin/mail -s "Centrisity_Archive" buboni2009@yandex.ru < /tex
Fi
Pin
}pin() {
ping 192.168.1.2 -c 6
label=$?
if [ "$label" = 0 ]; then
proverka
else /bin/mail -s "Centrisity_Archive" buboni2009@yandex.ru < /tex1
fi
proverka
}proverka() {
/bin/echoscu -aec DCM4CHEE 127.0.0.1 11112 -v
label=$?
if [ "$label" = 0 ]; then
sleep 300
prov
else /etc/init.d/capi restart
fi
sleep 120
/bin/echoscu -aec DCM4CHEE 127.0.0.1 11112 -v
label=$?
if [ "$label" = 0 ]; then
sleep 300
prov
else /etc/init.d/capi restart
fi
sleep 120/bin/echoscu -aec DCM4CHEE 127.0.0.1 11112 -v
label=$?
if [ "$label" = 0 ]; then
sleep 300
prov
else /etc/init.d/capi restart
fi
sleep 120/bin/echoscu -aec DCM4CHEE 127.0.0.1 11112 -v
label=$?
if [ "$label" = 0 ]; then
sleep 300
prov
else shutdown -r now
fi
}
Prov
пусть этот скрипт имеет название restart
Теперь мне нужно этот скрипт запускать как службувот те сообщения которые появляются если использовать исполняемый скрипт с названием restard (на верху)
он мне выдает состояние в списках служб
env: /etc/init.d/restartd: No such file directoryгде restartd имеет название исполнительный скрипт службы
а restart мой скрипт
restard!!!! )))) Опечатка возможно в этом моя ошибка ))))))если запустить в терминале
bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталогазаранее спасибо
>prov() {
> /bin/echoscu -aec CONQUESTSRV1 192.168.1.2 5678 -v -to 5
> label=$?
> if [ "$label" = 0 ]; then
>pin
> else
>/bin/mail -s "Centrisity_Archive" buboni2009@yandex.ru < /tex
>FiДля начала: у вас в скрипте написано именно так - "Fi"? Если да, то исправьте на "fi".
Это, конечно, вряд ли устранит вашу основную проблему, но ситуацию точно не ухудшит. :-)
>[оверквотинг удален]
>> if [ "$label" = 0 ]; then
>>pin
>> else
>>/bin/mail -s "Centrisity_Archive" buboni2009@yandex.ru < /tex
>>Fi
>
>Для начала: у вас в скрипте написано именно так - "Fi"? Если
>да, то исправьте на "fi".
>Это, конечно, вряд ли устранит вашу основную проблему, но ситуацию точно не
>ухудшит. :-)ХОРОШО ИСПРАВЛЯЮ)))
И не только Fi/fi. Если у вас функции называются "prov" и "pin", то и их вызовы должны быть "prov" и "pin", а не "Prov" и "Pin". bash это не Basic или Pascal, тут имеет значение буковки большие или маленькие.
>И не только Fi/fi. Если у вас функции называются "prov" и "pin",
>то и их вызовы должны быть "prov" и "pin", а не
>"Prov" и "Pin". bash это не Basic или Pascal, тут имеет
>значение буковки большие или маленькие.Да я уже переделываю весь скрипт так использовать функции в моей задаче нереально (( (а сними проще, они похожи на команду go to))) )
половину исправил вот голову ломаю как сделать условие трех раз.
если есть пример покажите плиз.
>[оверквотинг удален]
> echo $"Usage: $0 {start|stop|restart}"
>
> exit 1
> esac
> exit $?
>
>
>Помогите плиз кто чем может хоть ссылкой на какой нить пример погибаю,
>заранее спсибо.
>Странно у вас написанно !#/bin/sh , а ошибка bin/bash^M:.
У меня есть подозрения, хотя не должно такого быть, но может быть /bin/sh это симлинка на /bin/bash, и по каким-то причинам кто-то ее затер, а потом неправильно создал.
Думаю чтоб исключиить данную возможность стоит проверить.
# ls -la /bin/sh
le directory
>
>если запустить в терминале
>
>bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталогаесли вы сочиняете ваши скрипты в любимом редакторе в винде - помните нужно делать конвертацию с win2unix - просто потому что есть различая в обозначении перенос на следующую строку.
>le directory
>>
>>если запустить в терминале
>>
>>bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога
>
>если вы сочиняете ваши скрипты в любимом редакторе в винде - помните
>нужно делать конвертацию с win2unix - просто потому что есть различая
>в обозначении перенос на следующую строку.нет я делаю в centos
Народ у меня теперь повис ещё один вопросик при вызове функций prov и proverka из следующей через какое-то время стек будет переполнен, и скрипт подвесит свой экземпляр bash точно, а может, и всю систему ))) можно ли как нибудь еще организовать переходы не используя функции?
>Народ у меня теперь повис ещё один вопросик при вызове функций
>prov и proverka из следующей через какое-то время стек будет переполнен,
>и скрипт подвесит свой экземпляр bash точно, а может, и всю
>систему ))) можно ли как нибудь еще организовать переходы не
>используя функции?Ха. Посмотрел я еще раз на ваш скрипт повнимательнее - да вы, батенька, круты до неимоверности. Вы программируете в чистом функциональном стиле, который доступен только гуру Хаскеля, Лиспа и Схемы высшей ступени посвящения :)
К сожалению, интерпретатор bash не реализует "оптимизацию хвостовой рекурсии" (tail recursion optimization).
В этих условиях вам, пожалуй, прийдется спуститься с вершин функционального стиля и снизойти до использования простых циклов:
while [ condition ] ; do
command
done
>[оверквотинг удален]
>
>К сожалению, интерпретатор bash не реализует "оптимизацию хвостовой рекурсии" (tail recursion optimization).
>
>
>В этих условиях вам, пожалуй, прийдется спуститься с вершин функционального стиля и
>снизойти до использования простых циклов:
>
> while [ condition ] ; do
> command
> done)))))я уже понял и переписываю скрипт.
вот только застрял на вопросе как реализавать условие:
если после 3 раз не получается, выполнить то тоесли сможешь намекни)) заранее спасибо
>[оверквотинг удален]
>>
>> while [ condition ] ; do
>> command
>> done
>
>)))))я уже понял и переписываю скрипт.
>вот только застрял на вопросе как реализавать условие:
>если после 3 раз не получается, выполнить то то
>
>если сможешь намекни)) заранее спасибоНапример:
COUNTER=0
SUCCESS="false"
while [ $COUNTER -lt 4 -a $SUCCESS = "false" ]; do
if [ $COUNTER -ge 3 ]; then
kill the programmer
else
let the programmer live for a while and do smething useful
calculate success condition
if [ success condition ]; then
SUCCESS="true"
fi
fi
let COUNTER=COUNTER+1
doneПодробнисти смотри здесь: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
а также 'man test'
>[оверквотинг удален]
>
>SUCCESS="true"
> fi
> fi
> let COUNTER=COUNTER+1
>done
>
>Подробнисти смотри здесь: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
>
>а также 'man test'блин постояно крутит цикл даже если условие выхода верно
мррр а есть какие нибудь еще примеры
>[оверквотинг удален]
>> fi
>> let COUNTER=COUNTER+1
>>done
>>
>>Подробнисти смотри здесь: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
>>
>>а также 'man test'
>
>блин постояно крутит цикл даже если условие выхода верно
>мррр а есть какие нибудь еще примерыНет, если SUCCESS становится "true", условие цикла становится false и скрипт выходит из цикла.
Но можно, к примеру, переписать это так:
COUNTER=0
while [ $COUNTER -lt 3 ]; do
let the programmer do something useful
calculate success condition
if [ success condition ]; then
break
fi
let COUNTER=COUNTER+1
done
if [ $COUNTER -eq 3 ]; then
kill the programmer
fi
>[оверквотинг удален]
> let the programmer do something useful
> calculate success condition
> if [ success condition ]; then
> break
> fi
> let COUNTER=COUNTER+1
>done
>if [ $COUNTER -eq 3 ]; then
> kill the programmer
>fiОй сори я разобрался ))) огромное спасибо тебе друг
Ну вот беда откуда не ждал
допустим я хочу организовать 2 цикла (цикл в цикле)
1.цикд
while [условие]; do
команды2.цикл
until [условие]; do
команды
done
doneИ вот как только он выходит из второго перед ним done от первого, а он зараза думает что от второго и второй цикл начинается заново а мне нужно чтоб начинался с первого (((
как тут быть?
>[оверквотинг удален]
> until [условие]; do
>команды
>done
>done
>
>И вот как только он выходит из второго перед ним done
>от первого, а он зараза думает что от второго и второй
>цикл начинается заново а мне нужно чтоб начинался с первого (((
>
>как тут быть?Искать, где вы совершили очередную ошибку. :-)
Для иллюстрации - вот код:
let i=0
while [ $i -lt 3 ]
do
let j=0
((i++))
echo "While loop $i"
until [ $j -eq 3 ]
do
((j++))
echo " Until loop $j"
done
doneА это - результат его работы:
While loop 1
Until loop 1
Until loop 2
Until loop 3
While loop 2
Until loop 1
Until loop 2
Until loop 3
While loop 3
Until loop 1
Until loop 2
Until loop 3
Как видите, операторы циклов не путают свой "done" с чужим. ;-)
>[оверквотинг удален]
>>>
>>>если запустить в терминале
>>>
>>>bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога
>>
>>если вы сочиняете ваши скрипты в любимом редакторе в винде - помните
>>нужно делать конвертацию с win2unix - просто потому что есть различая
>>в обозначении перенос на следующую строку.
>
>нет я делаю в centosМожет вы изначально создали текст скрипта в Windows. Или может у вашего редактора включена опция "Сохранять файл в Windows/DOS формате" или "Авто-определение конца строк" или что-то похожее. Сейчас это не важно - система жалуется что она не может найти файл "bin/bash^M", именно так, с символом "^M" в конце имени.
Попробуйте посмотреть файл скрипта в любом hex-editor, если в конце первой строки стоит "0D 0A" (т.е пара ASCII-символов CR-LF (Carriage Return - Line Feed)), надо "0D" убрать - "0D" это тот самый "^M" (Carriage Return).
А вот "0A" - это Line Feed, который в Linux (Unix) и означает конец строки. Все что находится до Line Feed, система воспринимает как имя файла. А файла "bin/bash^M" нету.