September 2011 Archives

"Демонизация" MetatTader for Linux

После того как торговый терминал MetaTrader успешно установился и запустился на OS Debian GNU/Linux без графического окружения, возникла нужда запускать его автоматически при старте системы/падении терминала.
Изначально это осуществлялось по cron, но потом захотелось "демонизировать" терминал (запускать как сервис из rc.d). В результате получился Debian-like rc.d скрипт.
Итак:
nano /etc/init.d/metatrader
#! /bin/sh
### BEGIN INIT INFO
# Provides:          metatrader
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: MetaTrader init script
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export DISPLAY=:2
USER="metatrader"
NAME=$USER
TERMINAL="/usr/bin/wine /home/$USER/.wine/drive_c/metatrader/terminal.exe"
SCRIPTNAME=/etc/init.d/$NAME
XVFB=/usr/bin/Xvfb
XVFB_ARGS="$DISPLAY -screen 0 800x600x16 -nolisten tcp"
XVFB_PIDFILE=/var/run/xvfb.$NAME.pid

[ -x "$XVFB" ] || exit 0

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start()
{
        log_daemon_msg "Starting $NAME" "MetaTrader"

        log_daemon_msg "Starting" "Xvfb"
        start-stop-daemon --start --quiet \
            --make-pidfile --chuid $USER \
            --pidfile $XVFB_PIDFILE --exec $XVFB -- \
            $XVFB_ARGS > /dev/null 2>&1 &
        log_end_msg 0

        log_daemon_msg "Starting" "terminal"
        start-stop-daemon --start --quiet \
                        --chuid $USER  --exec $TERMINAL > /dev/null 2>&1 &
        log_end_msg 0
}


do_stop()
{
        log_daemon_msg "Stoping $NAME" "MetaTrader"
        start-stop-daemon --stop --retry 5 --quiet \
            --pidfile $XVFB_PIDFILE --name Xvfb
        rm $XVFB_PIDFILE > /dev/null 2>&1 &
        log_end_msg 0
}
case "$1" in
  start)
        do_start
        ;;
  stop)
        do_stop
        ;;
  restart)
        do_stop
        do_start
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 3
        ;;
esac
exit 0
update rc.d metatrader defaults
Собственно и все. Так же можно поставить alertmon для мониторинга работы терминала. Лично у меня alertmon следит за процессом работы терминала и при его падении делает service metatrader restart.