Страница 1 из 1

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

Добавлено: 2013-07-11 0:36:51
Demontager
Написал скрипт запуска билинга 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 (который остается от процесса парсинга).

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

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

"

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

Добавлено: 2013-07-11 11:11:00
kpp
Логично ведь, то, что процесс либо не убивается либо не успевает убиться.

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

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

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

Добавлено: 2013-07-11 17:24:51
kpp
Возможны варианты.
После kill в цикле проверять наличие процесса.
Наличие процесса лучше грепать по PID, а не по имени.
В момент запуска процесса - сохранить его PID.

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

Добавлено: 2013-08-10 22:58:27
Demontager
Решил таки доделать скрипт, вообщем сейчас работает как нужно.
Проблему с присваиванием лишнего 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