Категорії
Solaris

Создаём сервис SMF

Обновлена 25.07.2013

При установке разного рода приложений, разработчики не всегда уделяют внимание на создание скрипта запуска и тем более занесения его в SMF. В данной статье я покажу пример создания сервиса для mysql и nagios.

Примечание.

1) Существует и интерактивный способ создания – через утилиту manifold.
2) Для Solaris 11.1 появился встроенный механизм – svcbundle

Тестовый стенд: Solaris 11, Solaris 11.1

Solaris 11.1

Допустим, наш сервис должен запускаться вот так:

# /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg

Тогда команда создания манифеста выглядит так:

# svcbundle -o /lib/svc/manifest/site/nagios.xml -s service-name=application/nagios -s model=daemon -s start-method="/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg"

Теперь остаётся только перезапустить службу импорта манифестов и сервис готов:

# svcadm restart manifest-import
# svcs nagios
STATE STIME FMRI
online 2:13:01 svc:/application/nagios:default
# ps -ef | grep nagios
nagios 25743 1 0 00:50:43 ? 0:06 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg

А можно всё сделать и одной командой, используя параметр “-i” (при этом сервис импортируется куда надо и перезапуститься служба manifest-import):

# svcbundle -i -s service-name=application/nagios -s model=daemon -s start-method="/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg"

Solaris 11

1) Предустановки

Я качал mysql5.5.19 с официального сайта для и ставил через pkgadd. Сам mysql установлен в каталог /opt/mysql/mysql.

2) Создания манифеста.

Создадим папку, где будет лежать наш манифест:

#mkdir /var/svc/manifest/application/database

и в этой папке создадим манифест mysql.xml такого содержания:

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!--
    Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
    Use is subject to license terms.

    pragma ident        "@(#)server.xml 1.2     04/08/09 SMI"
-->

<service_bundle type='manifest' name='mysql'>

<service
    name='application/database/mysql'
    type='service'
    version='1'>

    <dependency
        name='network'
        grouping='require_all'
        restart_on='none'
        type='service'>
        <service_fmri value='svc:/milestone/network:default' />

    </dependency>

<dependency
    name='filesystem-local'
    grouping='require_all'
    restart_on='none'
    type='service'>
    <service_fmri value='svc:/system/filesystem/local:default' />
</dependency>

<exec_method
    type='method'
    name='start'
    exec='/lib/svc/method/mysql start'
    timeout_seconds='60' />

<exec_method
    type='method'
name='stop'
exec='/lib/svc/method/mysql stop'
timeout_seconds='60' />

<instance name='version_55' enabled='false'>

    <method_context>
    <method_credential user='mysql' group='mysql' />
    </method_context>

    <property_group name='mysql' type='application'>
        <propval name='bin' type='astring'
            value='/opt/mysql/mysql/bin' />
        <propval name='data' type='astring'
            value='/opt/mysql/mysql/db' />
    </property_group>

</instance>

<stability value='Evolving' />

<template>
    <common_name>
        <loctext xml:lang='C'>
            MySQL RDBMS
        </loctext>
    </common_name>

    <documentation>
        <manpage title='MySQL 5.5.19' section='1' />
        <doc_link name='mysql.com' uri='http://dev.mysql.com/docs' />
    </documentation>
</template>

</service>

</service_bundle>

Обязательно проверьте переменные в этом скрипте и если они отличаются от ваших – исправьте.

3) Импорт манифеста.

Что бы наш сервис появился в svcs -a добавим манифест mysql:

#svccfg import /var/svc/manifest/application/database/mysql.xml
#svcs -a | grep mysql
disable 13:11:49 svc:/application/database/mysql:version_55

Если после импорта вы вспомнили, что забыли что-то изменить, то внести изменения можно 2-мя способами:

– через svccfg
– изменить манифест и импортировать заново

4) Создание стартового скрипта.

Создадим скрипт управления сервисом (запуск\перезапуск) /lib/svc/method/mysql такого содержания:

getproparg() {
    val=`svcprop -p $1 $SMF_FMRI`
    [ -n "$val" ] && echo $val
}

MYSQLBIN=`getproparg mysql/bin`
MYSQLDATA=`getproparg mysql/data`
PIDFILE=${MYSQLDATA}/`/usr/bin/uname -n`.pid

if [ -z $SMF_FMRI ]; then
    echo "SMF framework variables are not initialized."
    exit $SMF_EXIT_ERR
fi

if [ -z ${MYSQLDATA} ]; then
    echo "mysql/data property not set"
    exit $SMF_EXIT_ERR_CONFIG
fi

                    if [ ! -d ${MYSQLDATA} ]; then
                        echo "mysql/data directory ${MYSQLDATA} is not a valid MySQL data directory"
                        exit $SMF_EXIT_ERR_CONFIG
                    fi
if [ ! -d ${MYSQLDATA}/mysql ]; then
    ${MYSQLBIN}/mysql_install_db --user=mysql --datadir=${MYSQLDATA}
fi
mysql_start() {

    echo ${MYSQLBIN}/mysqld --user=mysql --datadir=${MYSQLDATA} --pid-file=${PIDFILE}
    ${MYSQLBIN}/mysqld --user=mysql --datadir=${MYSQLDATA} --pid-file=${PIDFILE} > /dev/null &

}

mysql_stop() {

    if [ -f ${PIDFILE} ]; then
        pkill mysqld
    fi
}

case "$1" in

    'start')

        mysql_start
        ;;

    'stop')

        mysql_stop
        ;;

       \*)
        echo "Usage: $0 {start|stop}"
        exit 1

esac

exit $SMF_EXIT_OK

и присвоим ему права 555.

5) Запуск

Теперь можно запустить mysql:

#svcadm enable mysql
# svcs -a | grep mysql
online 13:11:49 svc:/application/database/mysql:version_55

Примечание.

В 11.2 появился механизм svcio, позволяющий создавать текстовые файлы на основе свойств сервисов. А так же smf_stencil – определяет отношение между этими текстовыми файлами и свойствами сервиса.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff