The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Запуск Скрипта, !*! Buboni, 04-Сен-09, 15:01  [смотреть все]
Сразу извеняюсь если не правильно выражаюсь есть такая проблемка, написал Bash скриптик который раз в 5 минут проверяет DICOM запросы от программы, если нет ответа запускает службу рестарт сервиса  если 3 раза не получается то в перезагрузку CENTOS.

Всё прекрасно работает в терминале, но вот я хотел проверить это скрипт загрузить в авто загрузку.
как только прописал в rc.local и перезагрузил то система виснет на обработке скрипта и всё думаю из-за того что в скрипте есть петля(((  

Но на самом деле мне нужно этот скрипт запускать как службу

Можно ли  мне мой скрипт запустить как службу?  

Пытался сделать как написано тут
https://www.opennet.ru/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, 16:14 , 04-Сен-09 (1)
    >bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога
    >
    >Но он то там есть)))

    Во-первых, где "там" указан именно bin/bash? Что-то я нигде такой строчки не обнаружил...
    Во-вторых, если он "там" все-таки есть, то не следовало ли указать полный путь: _/bin/bash?
    В-третьих, "^M" ненавязчиво намекает на то, что было бы неплохо файлы, отредактированные
    в Windows, привести в человеческий вид с помощью, например, dos2unix, fromdos или d2u.

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

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

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

      • Запуск Скрипта, !*! allez, 17:10 , 06-Сен-09 (3)
        >может у кого пример есть скрипта запуска службы?

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

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

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

          • Запуск Скрипта, !*! allez, 18:42 , 06-Сен-09 (5)
            >вот наверху пример и вроде все правильно, но не работает.

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

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

            • Запуск Скрипта, !*! buboni, 20:19 , 06-Сен-09 (6)
              >>вот наверху пример и вроде все правильно, но не работает.
              >
              >В таком случае запустите его руками и процитируйте сообщения, которые будут выданы
              >на экран.
              >Именно процитируйте (методом "скопировать-вставить"), а не пересказывайте своими словами.  Кстати,
              >я, если честно, так толком и не понял, как называется ваша служба:
              >"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, 20:33 , 06-Сен-09 (7)
                >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, 21:49 , 06-Сен-09 (8)
                  >[оверквотинг удален]
                  >> if [ "$label" = 0 ]; then
                  >>pin
                  >>  else
                  >>/bin/mail -s "Centrisity_Archive" buboni2009@yandex.ru < /tex
                  >>Fi
                  >
                  >Для начала: у вас в скрипте написано именно так - "Fi"? Если
                  >да, то исправьте на "fi".
                  >Это, конечно, вряд ли устранит вашу основную проблему, но ситуацию точно не
                  >ухудшит. :-)

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


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

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


  • Запуск Скрипта, !*! Arpo, 09:02 , 07-Сен-09 (9)
    >[оверквотинг удален]
    >    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, 10:07 , 07-Сен-09 (10)
    le directory
    >
    >если запустить в терминале
    >
    >bash: /etc/rc.d/init.d/restard: bin/bash^M: плохой итерпретатор: Нет такого файла или каталога

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

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

      нет я делаю в centos

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

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

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

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

             while [ condition ] ; do
                 command
             done

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

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

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

            • Запуск Скрипта, !*! elvenic, 19:29 , 07-Сен-09 (18)
              >[оверквотинг удален]
              >>
              >>   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, 21:13 , 07-Сен-09 (19)
                >[оверквотинг удален]
                >            
                >SUCCESS="true"
                >        fi
                >    fi
                >    let COUNTER=COUNTER+1
                >done
                >
                >Подробнисти смотри здесь: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
                >
                >а также 'man test'

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

                • Запуск Скрипта, !*! elvenic, 22:12 , 07-Сен-09 (20)
                  >[оверквотинг удален]
                  >>    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, 09:08 , 08-Сен-09 (21)
                    >[оверквотинг удален]
                    >   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, 11:25 , 08-Сен-09 (22)
                      >[оверквотинг удален]
                      > 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, 17:10 , 07-Сен-09 (13)
        >[оверквотинг удален]
        >>>
        >>>если запустить в терминале
        >>>
        >>>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" нету.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру