URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8421
[ Назад ]

Исходное сообщение
"Запуск Скрипта"

Отправлено Buboni , 04-Сен-09 15:01 
Сразу извеняюсь если не правильно выражаюсь есть такая проблемка, написал 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 $?

Помогите плиз кто чем может хоть ссылкой на какой нить пример погибаю, заранее спсибо.
  


Содержание

Сообщения в этом обсуждении
"Запуск Скрипта"
Отправлено allez , 04-Сен-09 16:14 
>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].


"Запуск Скрипта"
Отправлено buboni , 05-Сен-09 23:08 
>[оверквотинг удален]
>>Но он то там есть)))
>
>Во-первых, где "там" указан именно [b]bin/bash[/b]? Что-то я нигде такой строчки не
>обнаружил...
>Во-вторых, если он "там" все-таки есть, то не следовало ли указать полный
>путь: [b][u]_/[/u]bin/bash[/b]?
>В-третьих, "^M" ненавязчиво намекает на то, что было бы неплохо файлы, отредактированные
>
>в Windows, привести в человеческий вид с помощью, например, [b]dos2unix[/b], [b]fromdos[/b] или
>[b]d2u[b].

bash я поменял не помагло, у меня есть только bash скрипт и мне нужно его запустить как службу) win файлов у меня нет.

может у кого пример есть скрипта запуска службы?


"Запуск Скрипта"
Отправлено allez , 06-Сен-09 17:10 
>может у кого пример есть скрипта запуска службы?

У вас их в /etc/init.d полно.


"Запуск Скрипта"
Отправлено buboni , 06-Сен-09 18:05 
>>может у кого пример есть скрипта запуска службы?
>
>У вас их в /etc/init.d полно.

вот наверху пример и вроде все правильно, но не работает.


"Запуск Скрипта"
Отправлено allez , 06-Сен-09 18:42 
>вот наверху пример и вроде все правильно, но не работает.

В таком случае запустите его руками и [u]процитируйте[/u] сообщения, которые будут выданы на экран.
Именно процитируйте (методом "скопировать-вставить"), а не пересказывайте своими словами.  Кстати,
я, если честно, так толком и не понял, как называется ваша служба: "restart", "restard" или "restartd". :-)

P. S. Да, и что из себя представляет /usr/local/sbin/restart? Если обычный скрипт, приведите здесь его.


"Запуск Скрипта"
Отправлено buboni , 06-Сен-09 20:19 
>>вот наверху пример и вроде все правильно, но не работает.
>
>В таком случае запустите его руками и [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: плохой итерпретатор: Нет такого файла или каталога

заранее спасибо


"Запуск Скрипта"
Отправлено allez , 06-Сен-09 20:33 
>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".
Это, конечно, вряд ли устранит вашу основную проблему, но ситуацию точно не ухудшит. :-)


"Запуск Скрипта"
Отправлено buboni , 06-Сен-09 21:49 
>[оверквотинг удален]
>> if [ "$label" = 0 ]; then
>>pin
>>  else
>>/bin/mail -s "Centrisity_Archive" buboni2009@yandex.ru < /tex
>>Fi
>
>Для начала: у вас в скрипте написано именно так - "Fi"? Если
>да, то исправьте на "fi".
>Это, конечно, вряд ли устранит вашу основную проблему, но ситуацию точно не
>ухудшит. :-)

ХОРОШО ИСПРАВЛЯЮ)))



"Запуск Скрипта"
Отправлено elvenic , 07-Сен-09 18:56 
И не только Fi/fi. Если у вас функции называются "prov" и "pin", то и их вызовы должны быть "prov" и "pin", а не "Prov" и "Pin". bash это не Basic или Pascal, тут имеет значение буковки большие или маленькие.

"Запуск Скрипта"
Отправлено buboni , 07-Сен-09 19:16 
>И не только Fi/fi. Если у вас функции называются "prov" и "pin",
>то и их вызовы должны быть "prov" и "pin", а не
>"Prov" и "Pin". bash это не Basic или Pascal, тут имеет
>значение буковки большие или маленькие.

Да я уже переделываю весь скрипт так использовать функции в моей задаче нереально (( (а сними проще, они похожи на команду go to)))  )
половину исправил вот голову ломаю как сделать условие трех раз.
если есть пример покажите плиз.



"Запуск Скрипта"
Отправлено Arpo , 07-Сен-09 09:02 
>[оверквотинг удален]
>    echo $"Usage: $0 {start|stop|restart}"
>            
>    exit 1
>        esac
>        exit $?
>
>
>Помогите плиз кто чем может хоть ссылкой на какой нить пример погибаю,
>заранее спсибо.
>

Странно у вас написанно !#/bin/sh , а ошибка bin/bash^M:.
У меня есть подозрения, хотя не должно такого быть, но может быть /bin/sh это симлинка на /bin/bash, и по каким-то причинам кто-то ее затер, а потом неправильно создал.
Думаю чтоб исключиить данную возможность стоит проверить.


# ls -la /bin/sh


"Запуск Скрипта"
Отправлено pavel_simple , 07-Сен-09 10:07 
le directory
>
>если запустить в терминале
>
>bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога

если вы сочиняете ваши скрипты в любимом редакторе в винде - помните нужно делать конвертацию с win2unix - просто потому что есть различая в обозначении перенос на следующую строку.


"Запуск Скрипта"
Отправлено buboni , 07-Сен-09 16:08 
>le directory
>>
>>если запустить в терминале
>>
>>bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога
>
>если вы сочиняете ваши скрипты в любимом редакторе в винде - помните
>нужно делать конвертацию с win2unix - просто потому что есть различая
>в обозначении перенос на следующую строку.

нет я делаю в centos


"Запуск Скрипта"
Отправлено buboni , 07-Сен-09 16:14 
Народ у меня теперь повис ещё один вопросик  при вызове функций prov и proverka из следующей через какое-то время стек будет переполнен, и скрипт подвесит свой экземпляр bash точно, а может, и всю систему )))  можно ли как нибудь еще организовать переходы не используя функции?

"Запуск Скрипта"
Отправлено elvenic , 07-Сен-09 17:26 
>Народ у меня теперь повис ещё один вопросик  при вызове функций
>prov и proverka из следующей через какое-то время стек будет переполнен,
>и скрипт подвесит свой экземпляр bash точно, а может, и всю
>систему )))  можно ли как нибудь еще организовать переходы не
>используя функции?

Ха. Посмотрел я еще раз на ваш скрипт повнимательнее - да вы, батенька, круты до неимоверности. Вы программируете в чистом функциональном стиле, который доступен только гуру Хаскеля, Лиспа и Схемы высшей ступени посвящения :)

К сожалению, интерпретатор bash не реализует "оптимизацию хвостовой рекурсии" (tail recursion optimization).

В этих условиях вам, пожалуй, прийдется спуститься с вершин функционального стиля и снизойти до использования простых циклов:

   while [ condition ] ; do
       command
   done


"Запуск Скрипта"
Отправлено buboni , 07-Сен-09 19:03 
>[оверквотинг удален]
>
>К сожалению, интерпретатор bash не реализует "оптимизацию хвостовой рекурсии" (tail recursion optimization).
>
>
>В этих условиях вам, пожалуй, прийдется спуститься с вершин функционального стиля и
>снизойти до использования простых циклов:
>
>   while [ condition ] ; do
>       command
>   done

)))))я уже понял и переписываю скрипт.
вот только застрял на вопросе как реализавать условие:
если после 3 раз не получается, выполнить то то

если сможешь намекни)) заранее спасибо


"Запуск Скрипта"
Отправлено elvenic , 07-Сен-09 19:29 
>[оверквотинг удален]
>>
>>   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'


"Запуск Скрипта"
Отправлено buboni , 07-Сен-09 21:13 
>[оверквотинг удален]
>            
>SUCCESS="true"
>        fi
>    fi
>    let COUNTER=COUNTER+1
>done
>
>Подробнисти смотри здесь: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
>
>а также 'man test'

блин постояно крутит цикл даже если условие выхода верно
мррр а есть какие нибудь еще примеры


"Запуск Скрипта"
Отправлено elvenic , 07-Сен-09 22:12 
>[оверквотинг удален]
>>    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



"Запуск Скрипта"
Отправлено buboni , 08-Сен-09 09:08 
>[оверквотинг удален]
>   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 от первого, а он зараза думает что от второго и второй цикл начинается заново а мне нужно чтоб начинался с первого (((
как тут быть?



"Запуск Скрипта"
Отправлено allez , 08-Сен-09 11:25 
>[оверквотинг удален]
> 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" с чужим. ;-)

"Запуск Скрипта"
Отправлено elvenic , 07-Сен-09 17:10 
>[оверквотинг удален]
>>>
>>>если запустить в терминале
>>>
>>>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" нету.