LINUX.ORG.RU
ФорумAdmin

Перезапуск программы при падении, Debian


0

1

Есть скрипт перезапуска программы при падении
#! /bin/bash
### BEGIN INIT INFO
# Provides: scriptName
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Example my init script
# Description: This file should be used to construct scripts to be placed in /etc/init.d
### END INIT INFO
VBoxHeadless --startvm winxp --vnc --vncport 2222 --vncpass 1234567890 &

while 1>0
do
ps -A | grep VBoxHeadless > /dev/null
if [ $? = «1» ]
then VBoxHeadless --startvm winxp --vnc --vncport 2222 --vncpass 1234567890 &
fi
sleep 5
done

Но когда, он запущен, не получается перезагрузить сервер командой shutdown -r now , сервер просто не перезагружается, походу скрипт снова запускает программу, сервер снова ее выкл и т.д. Что нужно вписать, чтобы при поступлении команды shutdown -r now в консоль, скрпит отключался.


Ответ на: комментарий от Solov

Да, это шаблон, пригодный как основа для правильного init-скрипта.

GotF ★★★★★ ()
Ответ на: комментарий от Solov

> skeleton это пример выгрузки\загрузки приложений ?

Это initscript. В него нужно вставить запуск и останов твоего VBox, и система вызовет запустит его при старте и остановит при останове.

И чтобы два раза не вставать: man update-rc.d

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

А если его этот скрипт остановит, то мой его снова перезапустит, и в итоге система не перезагрузится? Как сделать, чтобы при поступлении команды shutdown -r now в консоль, мой скрпит отключался?

Solov ()
Ответ на: комментарий от Solov

> Подскажите пожалуйста, как выгрузить скрипт из памяти, чтобы я смог перезагрузить сервер.

После написания скрипта, следующего соглашениям, и регистрации его в системе через update-rc.d, всё должно происходить автоматически. Но, для тестрования и отладки, можно использовать:

./yourscript start # для запуска

./yourscript start # для останова

Или, после регистрации его в системе:

/etc/init.d/yourscript start

/etc/init.d/yourscript stop

tailgunner ★★★★★ ()

В debian автоматический перезапуск демона при падении делается с помощью программы daemon (aptitude install daemon, man 1 daemon), при этом программа-демон обязана принимать ключ «не становиться демоном». В примере ниже предполагается, что программа /usr/sbin/FooBarBaz принимает ключ --dont-daemonize и пишет свой PID в /var/run/FooBarBaz.pid. Тебе осталось подправить только пути, опции и описание демона.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          FooBarBaz
# Required-Start:    $network $local_fs
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: FooBarBaz
# Description:       The deamon that foos, bars and bazes
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

DAEMON=/usr/sbin/FooBarBaz
NAME=FooBarBaz
DESC="Foo-Bar-Baz daemon"

DAEMONPIDFILE=/var/run/$NAME-daemon.pid
PIDFILE=/var/run/$NAME.pid

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

# Default options, these can be overriden by the information
# at /etc/default/$NAME
DAEMON_OPTS=""          # Additional options given to the server
START="no"
# Include defaults if available
if [ -f /etc/default/$NAME ] ; then
    . /etc/default/$NAME
fi

start() {
    if [ "x$START" = "xyes" ] || [ "x$START" = "xtrue" ] ; then
        log_daemon_msg "Starting $DESC " "$NAME"
        if daemon --name=$NAME-daemon --running ; then
            log_progress_msg "apparently already running"
            log_end_msg 0
            return 0
        fi
        daemon --name=$NAME-daemon --respawn --acceptable=10 \
            --delay=10 -- $DAEMON -f $DAEMON_OPTS
        log_end_msg $?
    else
        log_warning_msg "Not starting $DESC - edit /etc/default/$NAME"
        return 0
    fi
}

stop() {
    log_daemon_msg "Stopping $DESC" "$NAME"
    if  daemon --name=$NAME-daemon --running; then
        daemon --name=$NAME-daemon --stop
        log_end_msg $?
    else
        # If it's not running don't do anything
        log_progress_msg "apparently not running"
        log_end_msg 0
        return 0
    fi
}

restart() {
    if [ "x$START" = "xyes" ] || [ "x$START" = "xtrue" ] ; then
        if  daemon --name=$NAME-daemon --running; then
            log_daemon_msg "Stopping $DESC" "$NAME"
            daemon --name=$NAME-daemon --stop
            log_end_msg $?
        fi
	sleep 1
        log_daemon_msg "Starting $DESC" "$NAME"
        daemon --name=$NAME-daemon --respawn --acceptable=10 \
            --delay=10 -- $DAEMON --dont-daemonize $DAEMON_OPTS
        log_end_msg $?
    else
        log_warning_msg "Not starting $DESC - edit /etc/default/$NAME"
        return 0
    fi
}

case "$1" in
  start)
        start
        ;;
  stop|force-stop)
        stop
        ;;
  restart|force-reload)
        restart
        ;;
  status)
        log_daemon_msg "Checking status of $DESC" "$NAME"
        if daemon --name=$NAME-daemon --running; then
            log_progress_msg "running"
            log_end_msg 0
        else
            log_progress_msg "apparently not running"
            log_end_msg 1
            exit 0
        fi
        ;;
  reload)
        log_daemon_msg "Reloading $DESC configuration files" "$NAME"
        if daemon --name=$NAME-daemon --running; then
            kill -HUP `cat /var/log/$NAME.pid`
            log_end_msg $?
        else
            log_progress_msg "not running"
            log_end_msg 1
            exit 0
        fi
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac

exit 0
AEP ★★★★★ ()
Ответ на: комментарий от AEP

оопс, в скрипте в куске reload надо писать /var/run/$NAME.pid вместо /var/log/$NAME.pid

AEP ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.