Скрипт запуска Netams

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Скрипт запуска Netams

Непрочитанное сообщение Demontager » 2013-07-11 0:36:51

Написал скрипт запуска билинга netams4, почти все работает как мне хочется, кроме одной вещи - функции restart (). Почему-то скрипт не попадает в условие в start() if [ $NETAMS4 = 1 ].... , если он до этого работал. Но если процесс netams4 был true, то делает перезапуск нормально.
То есть так сейчас:
1. Процесс Netams работает

Код: Выделить всё

# ps ax|grep netams4.properties
 5626 pts/6    Sl     0:02 ../java/bin/java -Djava.net.preferIPv4Stack=true -cp ../lib/*:bin/:bin/netams4-jserver.jar com.netams.netams4.netams4 ../netams4.properties
 5628 pts/6    Sl     0:02 ../java/bin/java -Djava.net.preferIPv4Stack=true -cp ../lib/*:./lib/*:./war/WEB-INF/lib/*:../java/lib/tools.jar:war/WEB-INF/classes/ com.netams.netams4.wa.server.N4Service ../netams4.properties
 5630 pts/6    Sl     0:02 ../java/bin/java -Djava.net.preferIPv4Stack=true -cp ../lib/*:bin/:lib/*:bin/netams4-repserver.jar com.netams.netams4.report.server.ReportServer ../netams4.properties
 5737 pts/6    S+     0:00 grep --color=auto netams4.properties

теперь делаю:
# ./netams4.sh restart
Netams4 stopped
Netams4 already running
но он только останавливается, но не пускается

Код: Выделить всё

# ps ax|grep netams4.properties
 5762 pts/6    S+     0:00 grep --color=auto netams4.properties
root@dem-UX32VD:/home/dem# 
А вот если процесс netams4 не запщен:

Код: Выделить всё

 # ./netams4.sh restart
No Netams4 proccess running
Netams4 started

и тогда все нормально, он стартует.
Весь скрипт:

Код: Выделить всё

#!/bin/bash
#Date: 09.07.2013
#Netams4 startup script
#Author:demontager

PIDS=$(ps ax|grep netams4.properties|awk '{print $1;}')
NETAMS4=`ps ax|grep netams4.properties|awk '{print $1;}'|wc -l`
NPATH=/usr/local/netams4

start() {
	if [ $NETAMS4 = 1 ]   
	 then 
       cd $NPATH/jserver && sh jserver-startup.sh && cd $NPATH/webadmin && sh webadmin-startup.sh && cd $NPATH/repserver && sh repserver-startup.sh
       STARTCHECK=`echo $?`
      if [ $STARTCHECK = 0 ]
        then
        echo "Netams4 started"
      else 
         echo "Error starting Netams4"
     fi
      fi     
     if [ $NETAMS4 != 1 ]   
       then
        echo "Netams4 already running"
     fi
         }


stop() { 
if [ $NETAMS4 != 1 ]
	then
	   for i in $PIDS
	   do kill $i 2> /dev/null
    done
     echo "Netams4 stopped"
else
   echo "No Netams4 proccess running"
fi	  
       }
	  
      

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                   stop
                   sleep 2
                   start
                                     
                 
                 ;;
           *)
                echo "Usage: `basename $0` (start|stop|restart)"
                exit 1
                ;;
esac

exit 0

Функции start и stop проверил, все отрабатывается как надо, кроме restart(). Да и еще, я не могу сообразить как можно подавить присваивание переменной PID процесса. Вот, к примеру, в переменую $PIDS помещается 4 pid процесса, хотя всего netams4.sh процесса 3, я так понял что сама команда еще порождает процесс, вот отсюда и "ненужный" pid появляется. Поэтому в условиях проверяю на 1, а не на 0 . Ну и там где do kill $i 2> /dev/null стоит так, потомучто kill дает error в консоль на несуществующий Pid (который остается от процесса парсинга).

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Скрипт запуска Netams

Непрочитанное сообщение Demontager » 2013-07-11 0:50:21

p.s. Не успел отредактировать, первый абзац должен так быть -
"
Написал скрипт запуска билинга netams4, почти все работает как мне хочется, кроме одной вещи - функции restart (). Почему-то при restart скрипт не попадает в условие start() if [ $NETAMS4 = 1 ].... , если netams4 процесс запущен. Но если процесс netams4 не запущен, то делает перезапуск нормально.

"

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Скрипт запуска Netams

Непрочитанное сообщение kpp » 2013-07-11 11:11:00

Логично ведь, то, что процесс либо не убивается либо не успевает убиться.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Скрипт запуска Netams

Непрочитанное сообщение Demontager » 2013-07-11 15:36:36

Ну, вообщем да. А как решить чтобы он "прибился" полностью, еще sleep впихнуть ? А можно еще как-то подавить PID самого парсинга, чтоб оставались чисто pid-ы процессов ?

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Скрипт запуска Netams

Непрочитанное сообщение kpp » 2013-07-11 17:24:51

Возможны варианты.
После kill в цикле проверять наличие процесса.
Наличие процесса лучше грепать по PID, а не по имени.
В момент запуска процесса - сохранить его PID.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Скрипт запуска Netams

Непрочитанное сообщение Demontager » 2013-08-10 22:58:27

Решил таки доделать скрипт, вообщем сейчас работает как нужно.
Проблему с присваиванием лишнего PID, решил так - два раза сделал grep, т.е. когда делается grep второй раз, лишний pid уходит.
А вот проблему с restart тоже решил как мне кажется прямолинейно - чтобы переменная переприсваивалась, вынес ее в функцию и при start/stop она каждый раз проверяется.
В процессе допиливания узнал, оказывается, в sh нет возможности работать с массивами. Я хотел переменную с pid, которая идет столбиком, вывести в ряд. На bash это работает и в начале скрипта я это занотировал.
И сам уже рабочий скрипт

Код: Выделить всё

#!/bin/bash
#Date: 09.07.2013
#Author: demontager
#Netams4 standalone startup script
#Note: Has arrays, so does not work correct in "sh", but has nicer PIDs output.  

NPATH=/usr/local/netams4

check_root() {
if [[ ! $(whoami) = "root" ]]; then
	echo "Please run script as root"
	exit 1
fi
}

check_pid() {
PID=$(ps ax|grep netams4.properties|grep preferIPv4Stack|awk '{print $1;}')
}

start() {
check_root
check_pid
if [ -z "$PID" ]; then  
       cd $NPATH/jserver && sh jserver-startup.sh && cd $NPATH/webadmin && sh webadmin-startup.sh && cd $NPATH/repserver && sh repserver-startup.sh
       CHECK=`echo $?`
	if [ $CHECK = 0 ]; then
        echo "Netams4 successfully started"
      else 
         echo "Error starting Netams4"
    fi     
else 
        echo "Netams4 already running"  
fi
}


stop() {
check_root
check_pid
if [ -n "$PID" ]; then
	   for i in $PID
	   do kill $i
       done
     local array=( $PID )
     echo "Netams4 processes stopped: ${array[@]}"
else
   echo "Netams4 not running"
fi	  
} 

status() {
check_pid
local array=( $PID )
if [ -n "$PID" ]; then
echo "Netams running: ${array[@]}"
cat << EOF

User:
http://localhost:8080

Admin:
http://localhost:8080/webadmin/webadmin.html
EOF
else
   echo "Netams4 not running"
fi
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                sleep 2
                start                                                   
                ;;
         status)
                status
                 ;;       
           *)
                echo "Usage: `basename $0` (start|stop|restart|status)"
                exit 1
                ;;
esac