#!/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 "Программа"
Тока учтите что вы можете убивать тока процессы своего пользователя, для убивания процессов рута потребуются соответствующие прова, тоесть скрипты надо будет от рута запускать
while [ 1 ]; do
service Служба restart
/var/bin/Программа
done
Всеже оказалось что Программа остается в запущенной
но освобождает коммандную строку (не знаю как правильно назвать)
и в результате цикл запускается вновь
а есть ли способ отследить когда программа закрывается?
Программа - NEWCS - это сервис кардшаринга
я ее ручками запускаю в screen`e на своем сервере, а заглянув в скрин через какоето время обнаруживаю что процесс отстутствует
(>ps grep | newcs )
тоесть NEWCS может проработать час а может неделю
и потом "упасть"
и вот задача перезапустить ее после падения!!
но освобождает коммандную строку (не знаю как правильно назвать)
Понятно. Суть в том, что она запускается в фоне. А что за программа? Может, у неё есть какой-то параметр, чтобы она запускалась в фоне, и он используется по умолчанию?
Тогда сложнее. Вариант скрипта с kill/ps будет работать, но это сложновато, может, есть способ попроще, но я его не знаю.
killall - штука опасная, если несколько процессов одинаково называются.
Например, три пользователя запустили firefox, а вы из-под рута захотите сделать killall firefox - угадайте, что получится.
Вообще мысль у меня такая - что полагаться на ps тоже опасно и ненадёжно.
Лучше запускать процесс, запоминая его PID. Как делают демоны.
Например, как-то так:
все из под рута
-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
# 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
# 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