LinuxForum.Fans
Тема

Нужен скрипт для перезапуска программы

Автор: Sandr 9 сообщений 8482 просмотров
#12453

Извиняюсь что мог не туда запостить вопрос
Нужна помощь по написанию скрипта:

Итак есть Программа
использующая Службу

перед запуском Программы надо перезапустить Службу
обычно это выглядит так

>service Служба restart

>/var/bin/Программа

и вот когда программа закрывается хотелось бы чтобы
происходил перезапуск Службы
и запуск Программы

и так по вечному циклу!

как должен выглядить такой скрипт?

заранее спасибо!
------------
система CentOS 5.2

#12469

файл, например restart

text

#!/bin/bash
$SL = "тут имя процесса который надо перезапустить"
killall -w -v $SL 
#тут ее мы убиваем процесс
#теперь надо опять запустить нужную программу

далее

text

#!/bin/bash
/тут полный путь к скрипту который выше/restart #
/var/bin/Программа

Теперь закрытие программы

text

#!/bin/bash
$SL = "тут имя процесса который надо перезапустить"
killall -w -v $SL 
#тут ее мы убиваем процесс
# и точно так же убиваем /var/bin/Программа, 
# например killall -w -v "Программа"

Тока учтите что вы можете убивать тока процессы своего пользователя, для убивания процессов рута потребуются соответствующие прова, тоесть скрипты надо будет от рута запускать

#12470

while (true) {
service bla-bla-bla restart;
/path/to/program
}

Как переписать на bash, не помню, как там while реализуется, думаю, несложно... Это псевдоязык, сам алгоритм примерно такой. (=

Leviafan, какие-то сложности вы создаёте...

#12471
text

#!/bin/bash

while [ 1 ]; do service Служба restart /var/bin/Программа done

#12547

Благодарю всех

#12565

Atragor, ага, именно так. =)
Надо мне будет подлатать свои знания по bash - в последнее время часто нужно.

#12617
Atragor написал:
text

#!/bin/bash

while [ 1 ]; do service Служба restart /var/bin/Программа done

Всеже оказалось что Программа остается в запущенной
но освобождает коммандную строку (не знаю как правильно назвать)
и в результате цикл запускается вновь


а есть ли способ отследить когда программа закрывается?
Программа - NEWCS - это сервис кардшаринга

я ее ручками запускаю в screen`e на своем сервере, а заглянув в скрин через какоето время обнаруживаю что процесс отстутствует
(>ps grep | newcs )

тоесть NEWCS может проработать час а может неделю
и потом "упасть"
и вот задача перезапустить ее после падения!!

Помогите советом

#12626
Sandr написал:
но освобождает коммандную строку (не знаю как правильно назвать)

Понятно. Суть в том, что она запускается в фоне. А что за программа? Может, у неё есть какой-то параметр, чтобы она запускалась в фоне, и он используется по умолчанию?
Тогда сложнее. Вариант скрипта с kill/ps будет работать, но это сложновато, может, есть способ попроще, но я его не знаю.
killall - штука опасная, если несколько процессов одинаково называются.
Например, три пользователя запустили firefox, а вы из-под рута захотите сделать killall firefox - угадайте, что получится.

Вообще мысль у меня такая - что полагаться на ps тоже опасно и ненадёжно.
Лучше запускать процесс, запоминая его PID. Как делают демоны.
Например, как-то так:

text
start-stop-daemon -S -p /path/to/pidfile bla-bla-bla

И потом из файла pidfile брать нужный номер, и использовать его в скрипте.

#13371

а вот объясните такую странность
запускаю ручками
#/var/bin/newcs.pcsc
ВСЕ НОРМАЛЬНО

text
[ 17:05:17 ] [ Loader ] Reader type 9 on node 0
[ 17:05:17 ] [ PC/SC ] Device 0: OMNIKEY CardMan 3x21 00 00
[ 17:05:17 ] [ PC/SC ] Opening device OMNIKEY CardMan 3x21 00 00 
[ 17:05:17 ] [ PC/SC ] Device 0: OMNIKEY CardMan 3x21 00 00
[ 17:05:17 ] [ PC/SC ] Opening device OMNIKEY CardMan 3x21 00 00 
[ 17:05:18 ] [ ATR ] T=0  1etu=13.02us  Guardtime:15etu  WWT:76800etu

запускаю скрипт
#./newcs.sh

text
#!/bin/bash

killall -w -v newcs.pcsc service pcscd restart /var/bin/newcs.pcsc

ридер недоступен :(

text
[ 17:02:09 ] [ Loader ] Reader type 9 on node 0
[ 17:02:09 ] [ PC/SC ] Device 0: OMNIKEY CardMan 3x21 00 00
[ 17:02:09 ] [ PC/SC ] Opening device OMNIKEY CardMan 3x21 00 00 
[ 17:02:09 ] [ PC/SC ] Could not connect to device OMNIKEY CardMan 3x21 00 00
[ 17:02:09 ] [ PC/SC ] Card protocol mismatch. (0x8010000f)
[ 17:02:09 ] [ PC/SC ] Device 0: OMNIKEY CardMan 3x21 00 00
[ 17:02:09 ] [ PC/SC ] Opening device OMNIKEY CardMan 3x21 00 00 
[ 17:02:09 ] [ PC/SC ] Could not connect to device OMNIKEY CardMan 3x21 00 00
[ 17:02:09 ] [ PC/SC ] Card protocol mismatch. (0x8010000f)

все из под рута
-rwxr-xr-x 1 root root 120 Мар 12 00:07 newcs.sh

Кто может помочь адаптировать скрипт из debian в RHL

text
#! /bin/bash
# Author: eldon <eldon @ www.eurocardsharing.com>
# based on a basic debian skeleton startup script

# START EDIT HERE # NCSNAME=newcs.pcsc # your newcs bin version NCSDIR="/var/bin" # your newcs binary directory full path (without trailing /). NCSCONF="/etc/newcs.xml" # xml config full path NCSUSER=sandr # existing user that will run newcs daemon (you should NOT use root !). NCSNICE=10 # set the newcs daemon priority -20 (most favorable scheduling) to 19 (least favorable). # END EDIT HERE #

PATH=/usr/sbin:/usr/bin:/sbin:/bin # some unecessary default paths DESC="NewCS daemon" # dummy description NAME=newcs # dummy name DAEMON="$NCSDIR/$NCSNAME" # Daemon bin location DAEMON_ARGS="-nd -c $NCSCONF" # Keep -nd in place, ssd will fork to background itself (required to get a proper pid file) PIDFILE=/var/run/$NAME.pid # pid path LOG=/var/log/$NAME.log # log path SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed if [ ! -x "$DAEMON" ] then echo "$DAEMON does not exist" exit 0 fi

# Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions

# # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started daemon --start --quiet --chuid $NCSUSER --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 daemon --start --verbose --nicelevel $NCSNICE --make-pidfile --background --chuid $NCSUSER --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS 2>&1 >> $LOG \ || return 2

# Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time.

return $? }

# # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NCSNAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" }

case "$1" in start) echo "Starting $DESC" do_start case "$?" in 0) log_daemon_msg "Success" log_end_msg 0;; 1) log_daemon_msg "Already running" log_end_msg 1;; 2) log_daemon_msg "Failed" log_end_msg 2;; esac ;; stop) echo "Stopping $DESC" do_stop case "$?" in 0|1) echo "Success" ;; 2) echo "Failed !" ;; esac ;; restart) log_daemon_msg "Restarting $DESC" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 3 ;; esac

:

Вот что получилось

text
#
#!/bin/bash
#
# newcs        Startup script for the NewCS card sharing Server
#
# chkconfig: - 87 16
# description: Newcs
# processname: newcs
# config: /etc/newcs.xml
# pidfile: /var/run/newcs.pid

# Source function library. . /etc/rc.d/init.d/functions

if [ -f /etc/newcs.xml ]; then . /etc/newcs.xml fi

# Path to the server binary, and short-form for messages. newcs=${NEWCS-/var/bin/newcs.pcsc} prog=newcs pidfile=${PIDFILE-/var/run/newcs.pid} lockfile=${LOCKFILE-/var/lock/subsys/newcs} RETVAL=0

start() { echo -n $"Starting $prog: " daemon --pidfile=${pidfile} $newcs $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL }

# When stopping newcs a delay of >10 second is required before SIGKILLing the # newcs parent; this gives enough time for the newcs parent to SIGKILL any # errant children. stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $newcs RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! $newcs $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $newcs due to configuration syntax error" else killproc -p ${pidfile} $newcs -HUP RETVAL=$? fi echo }

# See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $newcs RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac

exit $RETVAL

Войдите или зарегистрируйтесь, чтобы ответить.