Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: /etc/init.d -- скрипт для запуска своего сервиса  (Прочитано 1663 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bureaua

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Помогите найти причину неработоспособности
Ubuntu 16.04 server

Пытаюсь запустить сервис через скрипт автозагрузки
Вот сам скрипт
#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi
### BEGIN INIT INFO
# Provides:          application
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: application server initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.  This example start a
#                    single forking daemon capable of writing a pid
#                    file.  To get other behavoirs, implemend
#                    do_start(), do_stop() or other functions to
#                    override the defaults in /lib/init/init-d-script.
### END INIT INFO

# Author: User
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/service/application/build/application
NAME=application
DESC="application Server application 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="yes"
# Include defaults if available
if [ -f /etc/default/$NAME ] ; then
    . /etc/default/$NAME
fi

start() {
    log_daemon_msg "Preparation of Starting $DESC " "$NAME"
    if [ "x$START" = "xyes" ] || [ "x$START" = "xtrue" ] ; then
        log_daemon_msg "Starting $DESC " "$NAME"
        if daemon --name=$NAME-daemon --running ; then
            log_progress_msg "application 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/run/$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

При запуске sudo /etc/init.d/application start в sysylog выдает вот такую ошибку
Sep  7 11:38:42 server systemd[1]: Starting LSB: application server initscript...
Sep  7 11:38:42 server application[30266]:  * Preparation of Starting application Server application daemon  application
Sep  7 11:38:42 server application[30266]:  * Starting application Server application daemon  application
Sep  7 11:38:42 server application[30266]:    ...done.
Sep  7 11:38:42 server systemd[1]: Started LSB: application server initscript.
Sep  7 11:38:42 server kernel: [ 5574.078724] traps: application[30279] general protection ip:7fa364119d16 sp:7ffe210a83f8 error:0 in libc-2.23.so[7fa36408f000+1c0000]
Sep  7 11:38:42 server application-daemon: application-daemon: client (pid 30279) killed by signal 11, respawning
Sep  7 11:38:42 server kernel: [ 5574.168581] traps: application[30298] general protection ip:7f133c9d5d16 sp:7ffe53da7ad8 error:0 in libc-2.23.so[7f133c94b000+1c0000]
Sep  7 11:38:42 server application-daemon: application-daemon: client (pid 30298) killed by signal 11, respawning
Sep  7 11:38:42 server kernel: [ 5574.256029] traps: application[30300] general protection ip:7fd3b93a7d16 sp:7fff88015a98 error:0 in libc-2.23.so[7fd3b931d000+1c0000]
Sep  7 11:38:42 server application-daemon: application-daemon: client (pid 30300) killed by signal 11, respawning
Sep  7 11:38:42 server kernel: [ 5574.342933] traps: application[30302] general protection ip:7f9bd9be8d16 sp:7ffcbb02add8 error:0 in libc-2.23.so[7f9bd9b5e000+1c0000]
Sep  7 11:38:42 server application-daemon: application-daemon: client (pid 30302) killed by signal 11, respawning
Sep  7 11:38:42 server kernel: [ 5574.429628] traps: application[30304] general protection ip:7ff99b736d16 sp:7fffa29ac978 error:0 in libc-2.23.so[7ff99b6ac000+1c0000]
Sep  7 11:38:42 server application-daemon: application-daemon: client (pid 30304) killed by signal 11, respawning
Sep  7 11:38:42 server application-daemon: application-daemon: terminating too quickly, waiting 10 seconds
Можно ли как-то узнать более подробней откуда ноги у этой проблемы растут?

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26062
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #1 : 07 Сентябрь 2016, 12:37:18 »
Используйте systemd.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн bureaua

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #2 : 07 Сентябрь 2016, 15:50:10 »
Написал скрипт для systemd:
[Unit]
Description=applicationUnit
After=syslog.target
After=network.target
After=mysql.service
Requires=mysql.service

[Service]
Type=forking
PIDFile=/opt/service/application/application-service.pid
WorkingDirectory=/opt/service/application

User=user
Group=user

Environment=RA=production

OOMScoreAdjust=-1000

ExecStart=/opt/service/application/build/application --file=/tmp/application.log
ExecStop=
ExecReload=
Restart=always
TimeoutSec=10

[Install]
WantedBy=multi-user.target

Но в результате получаю постоянную перезагрузку с вот такой ошибкой
Sep  7 15:47:05 server systemd[1]: Starting applicationUnit...
Sep  7 15:47:15 server systemd[1]: application-server.service: Start operation timed out. Terminating.
Sep  7 15:47:15 server systemd[1]: Failed to start applicationUnit.
Sep  7 15:47:15 server systemd[1]: application-server.service: Unit entered failed state.
Sep  7 15:47:15 server systemd[1]: application-server.service: Failed with result 'timeout'.
Sep  7 15:47:15 server systemd[1]: application-server.service: Service hold-off time over, scheduling restart.
Sep  7 15:47:15 server systemd[1]: Stopped applicationUnit.
Sep  7 15:47:15 server systemd[1]: Starting applicationUnit...

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26062
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #3 : 07 Сентябрь 2016, 15:54:27 »
Всегда отключайте перезагрузку и прочий контроль запуска до тех пор, пока у вас демон не подхватит задачу надёжно.
pidfile не нужен, если юнит настроен правильно.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн bureaua

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #4 : 07 Сентябрь 2016, 16:06:52 »
А что означает ошибка systemd[1]: application-server.service: Failed with result 'timeout'. ?

Если уберу параметр TimeoutSec=10, то имею вот такое
Sep  7 16:00:12 server systemd[1]: application-server.service: Start operation timed out. Terminating.
Sep  7 16:00:12 server systemd[1]: Failed to start applicationUnit.
Sep  7 16:00:12 server systemd[1]: application-server.service: Unit entered failed state.
Sep  7 16:00:12 server systemd[1]: application-server.service: Failed with result 'timeout'.

При этом приложение запускается нормально но из-за таймаута оно через некоторое время -- Terminating
Понимаю что параметр TimeoutSec -- это время отработки старт/стоп команд, но что приложение должно вернуть после нормального запуска?

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26062
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #5 : 07 Сентябрь 2016, 16:28:08 »
1. Убираете "Type=forking", да и вообще убираете всё, что не необходимо для запуска юнита.
2. Проверяете запуск юнита, сначала руками, потом в автомате.
3. Всегда проверяете статус юнита и актуальный статус демона. Играетесь с типом юнита и ключами приложения, пока не будет надёжного захвата. Type=forking - это ХУДШИЙ вариант.
4. Когда оба статуса совпадут и буду положительны, тогда и только тогда включаете всякие перезапуски.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн bureaua

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #6 : 07 Сентябрь 2016, 17:48:43 »
Спасибо!
Настроил, теперь работает так как нужно!

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26062
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #7 : 07 Сентябрь 2016, 18:02:59 »
Покажите, что получилось в итоге.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн bureaua

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #8 : 07 Сентябрь 2016, 18:11:10 »
Покажите, что получилось в итоге.

[Unit]
Description=applicationUnit
After=syslog.target
After=network.target
After=mysql.service
Requires=mysql.service

[Service]
Type=simple
WorkingDirectory=/opt/service/application

User=user
Group=user

Environment=RA=production

OOMScoreAdjust=-1000

ExecStart=/bin/sh -c '/opt/service/application/build/application > ./log/log.txt 2>&1'
Restart=always

[Install]
WantedBy=multi-user.target

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26062
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #9 : 07 Сентябрь 2016, 19:07:47 »
Уберите враппер.
systemd сам управляет логированием STDOUT.
Либо используйте возможности логирования самой программы, если они существуют.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн bureaua

  • Автор темы
  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #10 : 07 Сентябрь 2016, 22:09:33 »
Либо используйте возможности логирования самой программы, если они существуют.
К сожалению на данный момент нету, поэтому и пришлось использовать враппер

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26062
    • Просмотр профиля
Re: /etc/init.d -- скрипт для запуска своего сервиса
« Ответ #11 : 07 Сентябрь 2016, 22:50:22 »
Враппер НЕ НУЖЕН.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.06 секунд. Запросов: 24.