2013年4月10日 星期三

SmartOS Service Management Framework (SMF)



在SmartOS中,也有類似Linux的init.d的service架構,透過這部分的設定,系統可以在重新啓動的時候,自動帶入服務,也可以在異常crash的狀態下自動將服務帶起來,下面範例展示如何將自建的服務加入SMF中。

1. 下載SMF Manifest範例

wget --no-check-certificate http://github.com/isaacs/joyent-node-on-smart-example/raw/master/node-hello-world-service-manifest.xml

範例截取如下:



<!-- node-hello-world-service-manifest.xml -->
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="simon-test-service">
  <service name="site/simon-test-service" type="service" version="1">


    <create_default_instance enabled="true"/>


    <single_instance/>


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


    <dependency name="filesystem" grouping="require_all" restart_on="refresh" 
      type="service">
      <service_fmri value="svc:/system/filesystem/local"/>
    </dependency>


    <method_context working_directory="/root/simon-test">
    <method_credential user="root" group="root" privileges=”basic,net_privaddr” />
    <method_environment>
      <envvar name="PATH" 
        value="/opt/node/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin"/>
        <envvar name="HOME" value="/root"/>
      </method_environment>
    </method_context>


    <exec_method
      type="method"
      name="start"
      exec="/opt/node/bin/node /root/simon-test/app.js"
      timeout_seconds="60"/>


    <exec_method
      type="method"
      name="stop"
      exec=":kill"
      timeout_seconds="60"/>

    <property_group name="startd" type="framework">
      <propval name="duration" type="astring" value="child"/>
      <propval name="ignore_error" type="astring" value="core,signal"/>
    </property_group>
    <property_group name="application" type="application">
    </property_group>

    <stability value="Evolving"/>
    <template>
      <common_name>
        <loctext xml:lang="C">node.js simon-test service</loctext>
      </common_name>
    </template>
  </service>
</service_bundle>



2. 匯入SMF


svccfg import node-hello-world-service-manifest.xml

3. 檢視匯入服務狀態
[root@MiCloudGW01 ~]# svcs -a | grep simon-test
disabled        2:26:46 svc:/site/simon-test-service:default

4. 啓動服務
[root@MiCloudGW01 ~]# svcadm enable simon-test-service
[root@MiCloudGW01 ~]# svcs -a | grep simon-test       
online          2:34:04 svc:/site/simon-test-service:default

5. 關閉服務
[root@MiCloudGW01 ~]# svcadm disable simon-test-service
[root@MiCloudGW01 ~]# svcs -a | grep simon-test        
disabled        2:34:48 svc:/site/simon-test-service:default

6. 檢視服務LOG記錄
# tail -f `svcs -L simon-test`
PS: svcs -L [service name] 將顯示記錄檔所在位置

7. 檢視其他人的manifest怎麼寫的

[root@MiCloudGW01 ~]# svccfg export mysql                     
<?xml version='1.0'?>
<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='export'>
 <service name='network/mysql' type='service' version='0'>
   <create_default_instance enabled='true'/>
   <single_instance/>
   <dependency name='fs' grouping='require_all' restart_on='none' type='service'>
     <service_fmri value='svc:/system/filesystem/local'/>
   </dependency>
   <dependency name='net' grouping='require_all' restart_on='none' type='service'>
     <service_fmri value='svc:/network/loopback'/>
   </dependency>
   <method_context working_directory='/var/mysql'>
     <method_credential group='mysql' user='mysql'/>
     <method_environment>
       <envvar name='LD_PRELOAD_32' value='/usr/lib/extendedFILE.so.1'/>
     </method_environment>
   </method_context>
   <exec_method name='start' type='method' exec='/opt/local/share/smf/mysql-server/method start' timeout_seconds='18446744073709551615'/>
   <exec_method name='stop' type='method' exec='/opt/local/share/smf/mysql-server/method stop' timeout_seconds='18446744073709551615'/>
   <stability value='Evolving'/>
   <template>
     <common_name>
       <loctext xml:lang='C'>MySQL RDBMS</loctext>
     </common_name>
     <documentation>
       <manpage title='MySQL 5.5' section='1'/>
       <doc_link name='mysql.com' uri='http://dev.mysql.com/docs'/>
     </documentation>
   </template>
 </service>
</service_bundle>

8. 刪除已匯入的SMF
# svccfg delete simon-test-service

9. 其它進階功能,請參考svccfg man page
# man svccfg



Reference: