BigAdmin System Administration Portal
Solaris 10 OS의 서비스 관리 기능(SMF) 사용: 간단한 예제
Print-friendly VersionPrint-friendly Version

Don Turnbull, 2007년


소개

서비스 관리 기능(SMF)은 서비스와 서비스 관리를 위한 새 통합 모델로 Solaris 운영 체제에 포함되어 있습니다. SMF를 사용하면 Solaris 시스템의 시작과 종료 시 관리되는 프로세스에 대해 좀 더 깊이 있고 편리하게 볼 수 있습니다. 또한 SMF를 통해 관리되는 프로세스에서는 종속성을 갖출 수 있기 때문에, 특정 한 프로세스가 실패하거나 부적절하게 중지되면 재시작할 수 있도록 모니터됩니다.

SMF는 Solaris 10 OS에서 제공되는 예측적 자가 치유 기술의 핵심 부분으로, 관리 오류뿐 아니라 소프트웨어 및 하드웨어 오류에 대해서도 자동 복구를 제공합니다. 또한 SMF에서 관리되는 서비스는 루트 사용자가 아닌 사용자에게 위임할 수 있습니다. 결국 /etc/rc 스크립트가 계속 실행되더라도(역방향 호환성을 위해 존재하는 경우), SMF는 서비스 시작 및 중지를 위한 기존 방법의 후속 기능입니다.

SMF를 통해 서비스를 배포하면 환경이 좀 더 일관성있고 견고해집니다. 먼저 사용자는 간단한 명령(svcs -a)으로 Solaris OS를 쿼리하여 서비스가 실행 중인지 확인할 수 있습니다. 더 이상 연결을 시도하여 해당 연결이 성공했는지 의구심을 가질 필요가 없습니다. 또한 누군가가 실수로 서비스를 종료시키거나, 버그로 인해 코어 덤프가 발생하거나, 기타 프로세스 오류가 발생하는 등의 문제가 발생하면 중요한 서비스를 자동으로 다시 시작할 수 있습니다. SMF는 강력한 오류 처리뿐 아니라 자세하고 일반적인 로깅 기능을 제공하여 시스템 상태가 변경되더라도 서비스가 중단되지 않습니다. 자세한 내용은 smf(5) 설명서 페이지를 참조하십시오.

일반적인 소프트웨어를 설치하면 시스템 시작과 종료 중에 시작하고 중지해야 할 프로세스가 5개 넘게 발생할 수 있습니다. 또한 이러한 프로세스는 각 프로세스에 대해 의존적일 수 있어 프로세스가 실패할 경우 모니터해야 하고 다시 시작해야 할 수 있습니다. SMF의 서비스로 이러한 프로세스를 통합하기 위해 수행해야 할 논리적 단계는 각 프로세스별로 다음과 같습니다.

  • 서비스 매니페스트 파일을 만듭니다.
  • 메소드 스크립트 파일을 만들어 서비스 시작, 중지 및 다시 시작 메소드를 정의합니다.
  • svccfg(1M)를 사용하여 서비스 매니페스트를 확인하거나 가져옵니다.
  • svcadm(1M)을 사용하여 서비스를 활성화하거나 시작합니다.
  • svcs(1)를 사용하여 서비스가 작동 중인지 확인합니다.

한 예로, SAS 프로세스를 사용하여 SAS Metadata Server용 서비스 하나와 SAS Object Spawner용 서비스 하나를 만듭니다. 이 예에서 Object Spawner를 시작하려면 OMR을 먼저 시작해야 하며, Object Spawner를 중지하려면 OMR보다 먼저 중지해야 합니다.


OMR 서비스 구성

1단계

smf_method(5) 설명서 페이지의 설명에 따라 매니페스트 파일을 만듭니다. 확실하게 하기 위해 이 파일을 응용 프로그램과 관련된 파일 전용 디렉토리에 배치해야 합니다. 실제로 서비스는 SMF 내부에 있는 논리적 폴더에 구성됩니다. 따라서 응용 프로그램과 관련된 파일에 대해 전용 폴더를 보유하는 것이 합리적입니다. 하지만 SMF에 강제로 적용되는 특정 디렉토리 이름이나 위치 요구 사항은 없습니다.

이 예에서 OMR 서비스는 SAS 응용 프로그램 폴더의 일부분으로 SMF에 구성됩니다. 이는 논리적 그룹화로, SMF와 연결되고 이름이 sas인 물리적 폴더는 없습니다. 하지만 서비스를 관리하는 경우 해당 서비스는 application/sas/metadata에 의해 참조됩니다. 기타 SAS 관련 프로세스도 이후에 추가할 수 있으며 application/sas아래에서 확인할 수 있습니다. 예를 들어 파일 /var/svc/manifest/application/sas/metadata.xml은 다음 내용을 포함하여 만들어야 합니다.

<?xml version="1.0"?>
<!DOCTYPE service_bundle
  SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='SAS:Metadata'>
  <service
    name='application/sas/metadata'
    type='service'
    version='1'>
    <create_default_instance enabled='false' />
    <single_instance />

    <dependency
      name='multi-user-server'
      grouping='optional_all'
      type='service'
      restart_on='none'>
        <service_fmri value='svc:/milestone/multi-user-server' />
    </dependency>
    <exec_method
      type='method'
      name='start'
      exec='/lib/svc/method/sas/metadata %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='restart'
      exec='/lib/svc/method/sas/metadata %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='stop'
      exec='/lib/svc/method/sas/metadata %m'
      timeout_seconds='60' >
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <property_group name='startd' type='framework'>
      <propval name='duration' type='astring' value='contract' />
    </property_group>

    <template>
      <common_name>
        <loctext xml:lang='C'>
          SAS Metadata Service
        </loctext>
      </common_name>
      <documentation>
        <doc_link name='sas_metadata_overview' iri=
'http://www.sas.com/technologies/bi/appdev/base/metadatasrv.html'
        />
        <doc_link name='sas_metadata_install' uri=
            'http://support.sas.com/rnd/eai/openmeta/v9/setup' />
      </documentation>
    </template>
  </service>
</service_bundle>

매니페스트 파일은 기본적으로 2개의 탭으로 구성된 스탠자로 구성되며, 이 스탠자에는 프로세스를 시작하고, 중지하고, 다시 시작하는 방법을 정의하고, 종속성도 정의하는 등록 정보가 있습니다. 첫 번째 태그인 <service_bundle>는 그룹 서비스와 svcs 명령(svcs, svcmgr 등)의 매개 변수의 일부로 사용될 서비스 번들 이름을 정의하고, 내부 태그인 <service>는 특정 프로세스, 종속성 및 프로세스 조작 방법에 대해 정의합니다. 매니페스트 파일의 형식에 대한 자세한 내용은 service_bundle(4)의 설명서 페이지를 참조하십시오.

2단계

메소드 스크립트를 만듭니다. 이 파일은 Solaris OS의 이전 버전에서 사용된 기존의 rc 스크립트와 비슷하며, 프로세스를 성공적으로 시작, 중지 및 다시 시작하는 스크립트입니다. 이 스크립트는 서비스를 관리할 수 있는 모든 사용자에 대해 실행할 수 있어야 하며, 매니페스트 파일의 exec 등록 정보에서 참조되는 디렉토리와 파일 이름에 배치되어야 합니다. 이 절차에서 예를 들면, 올바른 파일은 1단계에서 작성한 매니페스트 파일을 기반으로 하는 /lib/svc/method/sas/metadata입니다. 메소드 스크립트에 대한 자세한 내용은 smf_method(5) 설명서 페이지를 참조하십시오.

#!/sbin/sh
# Start/stop client SAS MetaData service
#
.. /lib/svc/share/smf_include.sh
SASDIR=/d0/sas9-1205
SRVR=MSrvr
CFG=$SASDIR/SASMain/"$SRVR".sh

case "$1" in
'start')
        $CFG start
        sleep 2
        ;;
'restart')
        $CFG restart
        sleep 2
        ;;
'stop')
        $CFG stop
        ;;
*)
        echo "Usage: $0 { start | stop }"
        exit 1
        ;;
esac
exit $SMF_EXIT_OK

3단계

매니페스트 파일의 유효성을 검사하고 Solaris 서비스 리포지토리로 가져와 SMF에 서비스를 만들고, 서비스를 조작에 사용할 수 있도록 합니다. 다음 명령은 이 예에서 매니페스트를 위해 사용하는 올바른 파일 이름을 보여줍니다.

# svccfg
svc:> validate /var/svc/manifest/application/sas/metadata.xml
svc:> import /var/svc/manifest/application/sas/metadata.xml
svc:> quit

4단계

svcadm 명령을 사용하여 서비스를 활성화합니다. -t 스위치를 사용하면 정의를 지속 상태로 설정하지 않아도 서비스 정의를 테스트할 수 있습니다. 정의를 재부트 간 지속되는 영구적인 변경으로 설정하려면 -t 스위치를 제외시킵니다.

# svcadm enable -t svc:/application/sas/metadata

5단계

서비스가 온라인 상태인지 확인하고, svcs 명령을 사용하여 프로세스가 실제로 실행되고 있는지 확인합니다.

# svcs -a | grep sas
online  8:44:37 svc:/application/sas/metadata:default

# ps -ef | grep sas
.....
sas 26791  1  0  08:44:36 ?  0:00 /bin/sh /d0/SASMain/MSrvr.sh
.....

Object Spawner 서비스 구성

이제 이 예에서는 위의 OMR 프로세스와 Object Spawner 프로세스가 모두 구성됩니다. Object Spawner는 OMR에 종속됩니다. 이 문서의 나머지 부분에서는 종속적인 Object Spawner 프로세스 구성에 대해 설명합니다.

1단계

Object Spawner 서비스의 매니페스트 파일은 OMR 서비스에서 사용되는 매니페스트 파일과 유사하여 약간의 변경 사항이 있으며, 서로 다른 종속성이 하나 있습니다. 차이점은 다음 내용에 굵게 강조 표시됩니다.

<?xml version="1.0">
<!DOCTYPE service_bundle
  SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='SAS:ObjectSpawner'>
  <service
    name='application/sas/objectspawner'
    type='service'
    version='1'>
    <create_default_instance enabled='false' />
    <single_instance />
    <dependency
      name='sas-metadata-server'
      grouping='optional_all'
      type='service'
      restart_on='none'>
        <service_fmri value='svc:/application/sas/metadata' />
    </dependency>
    <exec_method
      type='method'
      name='start'
      exec='/lib/svc/method/sas/objectspawner %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='restart'
      exec='/lib/svc/method/sas/objectspawner %m'
      timeout_seconds='60'>
      <method_context>
        <method_credential user='sas' />
      </method_context>
    </exec_method>

    <exec_method
      type='method'
      name='stop'
      exec='/lib/svc/method/sas/ objectspawner %m'
      timeout_seconds='60' >
      <method_context>
        <method_credential user='sas' />
      <method_context>
    <exec_method>

    <property_group name='startd' type='framework'>
      <propval name='duration' type='astring' value='contract' />
    </property_group>

    <template>
      <common_name>
        <loctext xml:lang='C'>
          SAS Object Spawner Service
        </loctext>
      </common_name>
      <documentation>
        <doc_link name='sas_metadata_overview' iri=
'http://www.sas.com/technologies/bi/appdev/base/metadatasrv.html'
        />
        <doc_link name='sas_metadata_install' uri=
            'http://support.sas.com/rnd/eai/openmeta/v9/setup' />
      </documentation>
    </template>
  </service>
</service_bundle>

2단계

매니페스트 파일을 만든 후 스크립트 /lib/svc/method/sas/objectspawner를 만듭니다.

#!/sbin/sh
# Start/stop client SAS Object Spawner service
#
.. /lib/svc/share/smf_include.sh
SASDIR=/d0/sas9-1205
SRVR=ObjSpa
CFG=$SASDIR/SASMain/"$SRVR".sh

case "$1" in
'start')
        $CFG start
        sleep 2
        ;;
'restart')
        $CFG restart
        sleep 2
        ;;
'stop')
        $CFG stop
        ;;
*)
        echo "Usage: $0 { start | stop }"
        exit 1
        ;;
esac
exit $SMF_EXIT_OK

3단계

OMR 서비스에서 사용한 동일한 방식으로 매니페스트 파일의 유효성을 검사하고 가져옵니다.

# svccfg
svc:> validate /var/svc/manifest/application/sas/objectspawner.xml
svc:> import /var/svc/manifest/application/sas/objectspawner.xml
svc:> quit

4단계

OMR 서비스에서 사용한 동일한 방식으로 새 서비스를 활성화합니다.

# svcadm enable -t svc:/application/sas/objectspawner

5단계

마지막으로 서비스가 OMR 서비스에서 사용한 동일한 방식으로 작동되고 실행되고 있는지 확인합니다.

# svcs -a | grep sas
online  10:28:39 svc:/application/sas/metadata:default
online  10:38:20 svc:/application/sas/objectspawner:default

# ps -ef | grep sas
.....
sas 26791  1  0  18:44:36 ?  0:00 /bin/sh /d0/SASMain/MSrvr.sh
sas 26914  1  0  18:18:49 ?  0:00 /bin/sh /d0/SASMain/ObjSpa.sh
.....

실제 상황에서는 SAS의 기타 프로세스들이 있으며, 이 프로세스에는 상위 프로세스로 서비스 프로세스가 있습니다. 하지만 프로세스에 대한 메소드 스크립트로 정의된 스크립트가 실행 중이라면 svcs -a의 출력이 정확하다는 것을 의미합니다. 곧 서비스가 실행되고 있는 것입니다.


SMF 기능 데모

서비스가 구성된 대로 자동으로 자체 다시 시작하는지 표시하려면 현재 메타데이터 서버를 종료합니다(PID 26791).

# kill 26791

ps(1) 명령은 이전 메타데이터 PID 26791이 더 이상 존재하지 않고 새 PID 27035가 실행 중임을 보여줍니다. 사용자가 개입하지 않아도 모두 다시 시작됩니다.

# ps -ef | grep sas
.....
sas 27035  1  0  18:44:36 ?  0:00 /bin/sh /d0/SASMain/MSrvr.sh
sas 26914  1  0  18:18:49 ?  0:00 /bin/sh /d0/SASMain/ObjSpa.sh
.....

메타데이터 서버는 SAS 9 배포의 중요한 구성 요소이므로, SMF 기능을 통해 SAS 응용 프로그램 환경의 가용성이 크게 높아집니다. 대부분 응용 프로그램의 상황은 이와 유사합니다. SMF를 통해 응용 프로그램 프로세스를 자동화하고, 모니터하고, 관리할 수 있습니다. 이때 Solaris OS의 오버헤드는 더 적고, 관리자 사용자 정의도 더 적습니다.


Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin