监听总结之window服务本质和特点小结以及证明在window下监听程序其实就是多个(或是一个)监听配置的封装

window服务是什么


window下的服务其实就是(为一个程序,即可执行文件而)在注册表里的注册配置信息。

详见《window服务是什么嘛?


window服务特点:
1、
  如果修改上图红框里的名字, 则在服务管理器里,启动、停止或是刷新一个服务(如监听服务)时就会出问题,如”描述“这一列就是显示”读取失败“。也就是说在注册表里的有些键值是动态起作用的(不用重启电脑,修改即可生效,如Description)。但是有些则要重启才会生效,如监听服务里的 displayname就是这样。


  2、  同名进程都是一个程序(可执行文件exe)的复制,如任务管理器里的进程项里的svchost.exe,右键 转到服务后,右键属性看到 svchost.exe -k localsystemnetworkrestricted,这说明带参数的程序都对应一个进程。再比如oracle.exe也是。

          而各个监听服务里是没带参数的tnslsnr.exe,所以对应任务管理器里的进程项里的tnslsnr.exe只有一个,不是每个服务对应一个tnslsnr.exe进程。

         总之,带参数的服务和进程是一对一的关系,不带参数的服务和进程是多对一的关系。

      而服务和进程间(如启动、停止等)状态关系,阐述如下:

          属性里“可执行文件的路径项”中带有参数的服务和它对应的进程间的状态是相互一致的,即两者无论谁启动(停止)另一方也会跟着启动(停止)。例子,如oracle.exe和oracleserviceSID服务。

          属性里“可执行文件的路径项”中没有参数的服务和它对应的进程间的状态关系如下:

          进程停止,则所有与之对应的服务都会停止;有一个与之对应的服务启动,则进程就会启动。例子,如TNSLSNR.EXE和OracleOraHome11TNS监听名   服务。

    3、   lsnrctl命令,如从start到stop时,不仅可以使监听程序停止而且也会使对应的监听服务也停止。反之,对应的监听服务停止(启动),也会使监听程序监听程序停止(启动)

              startup或是shutdown命令(oracle.exe)可以启动或是停止实例,而不会使启动或是停止oracleserviceSID服务。反之,oracleserviceSID服务启动或是停止,也会使实例启动或是停止。

              RAC里,ASM服务(win2008操作系统里)启动了,但ASM实例还是没有启动,要用命令startup去启动,因为在Windows平台下可以修改Oracle实例不随服务启动

        总之,在window里,服务对应的进程是否随服务的启动而启动,是可以在注册表里设置的。详见《在Windows平台下可以修改Oracle实例不随服务启动

        附加:在window下,监听程序由(写到注册表中相应服务项)监听配置,tnslsnr.exe和服务组成。

=================================================================


在window下,有如下面名为LISTENER的监听配置:

LISTENER = 
  (DESCRIPTION_LIST = 
    (DESCRIPTION = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 
    ) 
  ) 
 
若说  (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 或  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
叫监听配置条目,那整个listener的配置就是一个监听程序。listener为这个监听程序的监听名。

监听程序,其实就是多个(或是一个)监听配置条目的封装。

在Linux下,监听程序就是tnslsnr.exe(根据监听名来读取listener.ora文件里的相关监听配置后先复制出)的一个复制进程(,并用这些相关监听配置初始化该进程)。但在,在window下,无论你启动多少监听程序,操作系统里就只有一个tnslsnr.exe的进程,所以在window下,监听程序(其实不是指的是一个进程)这个概念,其实是让tnslsnr.exe读取的该监听名的封装的监听配置。更确切地说,在window下,监听程序这个概念就是tnslsnr.exe(根据监听名来读取listener.ora文件里的相关监听配置后先创建出)的一个线程(,并用这些相关监听配置初始化该线程)。


下面是,证明启动在window下,一个监听程序(其实不是指的是一个进程),其实是让tnslsnr.exe读取该监听名的封装的监听配置。

首先,从开始菜单选择“运行”,输入“regedit”打开注册表编辑器,打开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\,服务管理器中的所有服务都可以在该项下找到。如下图所示:


        原以为打开Oracle的一个监听服务,会发现里面有写着对应的监听配置的信息。但实际上,没有。所以,认为既然一个监听服务里面没有有写着对应的监听配置的信息,那么不同监听服务的区别就只在于监听服务的名字不同,只要把一个监听服务名字(在上图红框类似的位置改名字)改为另一个监听服务名字(当然,这个一个监听服务名字先随便改成其他什么名字),再在服务管理器里,启动这个一个监听服务,则这个一个监听服务对应的监听程序还是可以正常起来。(在注册表里,将一个监听服务名a改为另一个监听服务名b。再在服务界面上启动监听服务名b,监听服务名b对应的监听程序还是可以正常启动。) 结果也正是如此,这就说明创建的监听服务的内容没有区别,只是名字区别而已。
       
这里我们讲下 在服务管理器里,启动一个监听服务会执行哪些过程:
        例如,我们启动 一个名为OracleOraHome11TNSListener的监听服务时,该监听服务就会根据[控制面板]=[服务]=OracleOraHome11TNSListener 的属性里“可执行文件的路径项”(为"F:/oracle/ora11/bin/TNSLSNR.EXE)的信息来启动TNSLSNR.EXE(如果还未启动的话)。TNSLSNR.EXE则会根据 监听服务OracleOraHome11TNSListener

提取其里面的监听名部分,即这里的Listener。再根据这个监听名Listener,TNSLSNR.EXE就会从listener.ora文件里读取相关的监听配置,这样TNSLSNR.EXE就会去监听监听配置所说的监听点了。这个就是window下所谓的启动监听程序的过程。

     这里,要强调的一点就是,监听服务名字是有格式要求的,即是OracleOraHome11TNS+监听名 的形式。不然,TNSLSNR.EXE是不能从监听服务名字中识别出监听名的。这种格式,是在设计TNSLSNR.EXE时设计死的。

   我们可以用sc命令来创建监听服务,例子如下:

     sc create OracleOraHome11TNSListener binpath= "F:/oracle/ora11/bin/TNSLSNR“   start= auto displayname= "IPSEC Services"    

  其中,OracleOraHome11TNSListener就是上面所说的监听服务名字,是有格式的,不能乱写(监听服务要启动的可执行文件TNSLSNR.EXE对监听服务名字是有格式要求,而其他的服务对应的可执行文件是否对其服务的服务名字有格式要求,都是取决于可执行文件自己的)。而displayname(显示名字)则可以随便写的。

    用sc命令创建成功一个监听服务后,还要在listener.ora文件里写上以Listener为监听名的监听配置,否则创建成功一个监听服务后直接启动该服务会提示”该服务由于未被程序(即TNSLSNR.EXE)使用而停止“。

====================================================================



你可能感兴趣的:(服务,注册表)