`
belmount
  • 浏览: 49162 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ruby 实现windows service启动和关闭 nginx和jruby trinidad

 
阅读更多

问题:单位只给windows server,部署环境被迫使用 jruby trinidad + nginx + mongodb,每次启动app需要开4个窗口(2个jruby)。共用的服务器经常被人关窗口,服务器重启后需手动启动。

解决办法:写windows 服务。

1. 使用win32-service gem。

需要本地编译。

gem install win32-service。

文档见http://win32utils.rubyforge.org/

2.编写服务

服务分为两个部分,一是service 安装和卸载的部分。另一部分为服务内容部分。

可参照

http://stackoverflow.com/questions/163497/running-a-ruby-program-as-a-windows-service

简化版的service 安装部分如下:

require "win32/service"
include Win32
class String; def to_dos() self.tr('/','\\') end end
class String; def from_dos() self.tr('\\','/') end end
#override to support utf8
class String; def strip() self end end

rubyexe="C:/bin/ruby.exe".to_dos
SERVICE_FILE= (File.expand_path(File.dirname(File.dirname(__FILE__)))+ '/service.rb').to_dos
SERVICE_NAME="Test Service"

if ARGV[0]
  case ARGV[0] 
  when "install" 
    Service.new(
      :service_name     => SERVICE_NAME, 
      :service_type       => Service::WIN32_OWN_PROCESS,
      :start_type         => Service::AUTO_START,
      :error_control      => Service::ERROR_NORMAL,
      :binary_path_name   => "#{rubyexe} #{SERVICE_FILE}",
      :description       => 'Run nginx, jruby all in one'
   )
  when "uninstall"  
    Service.delete(SERVICE_NAME)
  end
end

 注意:为何重载String.strip

原因在于中文版windows在安装服务过程中调用get_last_error会返回utf-8的字符,此时win32-service gem的error.rb会报invalidate byte sequence的错误。

原因是对字符串进行了strip

如果不进行strip则没有任何问题。

 

服务部分的代码如下:

#service.rb
require 'win32/daemon'
include Win32
SERVICE_LOG = File.expand_path(File.dirname(File.dirname(__FILE__)))+ '/services.log'
JR_PATH = 'c:\jruby-1.7.0\bin'
JR_LOG = File.expand_path(File.dirname(File.dirname(__FILE__)))+ '/jruby.log'

class Daemon

  def service_main
     while running?
        if @pid.nil?
          @pid = Process.spawn('c:\nginx-1.2.1\nginx.exe', 
            chdir: 'c:\nginx-1.2.1',
            out: SERVICE_LOG, err: :out)

          Process.detach @pid
          if @pid_jruby.nil?
            @pid_jruby = []
            start_jruby
          end
         
          Process.waitpid(@pid)
        else 
          sleep(3)
        end
     end
  end


  def service_stop
     if @pid
        pid_kill = Process.spawn('c:\nginx-1.2.1\nginx.exe -s stop', 
            chdir: 'c:\nginx-1.2.1',
            out: SERVICE_LOG, err: :out)
          Process.waitpid(pid_kill)
     end
     if @pid_jruby.size > 0 
       @pid_jruby.each do |pid| 
          pid_kill = Process.kill(9, pid)
       end
     end 
  end

  def start_jruby
    if @pid_jruby.empty?

      [3000, 4000].each do |port|
        cmd = "#{JR_PATH}\\jruby.exe -S trinidad -e production -p #{port}"
        pid =  Process.spawn(cmd, chdir: 'C:\app\', out:JR_LOG, err: :out)
        @pid_jruby << pid
        Process.detach pid
      end
    end
  end

end

Daemon.mainloop

 结果:

以上代码在ruby 1.9.3 win7 上通过

如在win7上报安装权限不足,请使用administrator 启动cmd console。

代码尚有refactory的空间,时间仓促,敬请谅解。

 

 

分享到:
评论

相关推荐

    windows下Nginx启动、关闭、重启bat工具

    标题中的“Windows下Nginx启动、关闭、重启bat工具”指的是在Windows操作系统中,使用批处理脚本(.bat文件)来管理Nginx服务器的启动、停止和重启操作。这种工具通常由IT专业人士创建,以简化Nginx服务的日常管理。...

    windows启动nginx.bat脚本

    windows启动nginx脚本

    windows系统下将nginx作为系统服务启动

    在Windows系统中,将Nginx配置为系统服务启动是一项重要的任务,这使得Nginx能够在每次系统开机时自动运行,无需手动启动。本教程详细介绍了如何在Windows Server 2008 R2上将Nginx-1.12.2版本设置为系统服务,确保...

    nginx服务化小工具

    将nginx服务集成到windows服务中,实现开机自启动! 将nginx服务集成到windows服务中,实现开机自启动! 将nginx服务集成到windows服务中,实现开机自启动! 将nginx服务集成到windows服务中,实现开机自启动! 将...

    nginx开机自启动安装包

    【标题】"nginx开机自启动安装包" 涉及的核心知识点主要集中在如何在系统启动时自动运行Nginx服务器,以及Nginx的基本结构和配置。Nginx是一款高性能的HTTP和反向代理服务器,常用于网站的负载均衡和静态资源处理。...

    window下快速启动nginx

    总结来说,"window下快速启动nginx"涉及到Windows环境下的Nginx安装、配置、启动和自动化管理。通过使用RunHiddenConsole.exe工具,我们可以实现无窗口启动Nginx,提升工作效率。同时,创建Windows服务则可以实现...

    windows 注册Nginx为服务,自动重启

    在Windows系统中,Nginx是一个广泛使用的开源Web服务器,常用于反向代理、负载均衡和静态内容服务。为了确保Nginx在系统启动时自动运行,并在异常情况下能够自动重启,我们需要将其注册为Windows服务。这个过程涉及...

    Windows系统下,将nginx注册为本地服亲测可用

    在Windows系统中,将Nginx注册为本地服务是一个常见的需求,这有助于自动化启动和管理Nginx服务器。本文将详细介绍如何使用名为"WinSW-x64.exe"的工具来实现这一目标。WinSW(Windows Service Wrapper)是一个开源...

    适用于Windows系统的nginx安装包(提供快速启动、停止脚本)

    本安装包就是专为Windows系统设计的,它包含了启动和停止Nginx服务的便捷工具。 首先,让我们了解一下Nginx的安装过程。在Windows系统下,通常需要下载Nginx的Windows二进制文件,这是一个压缩包。在这个案例中,...

    windows 系统设置 Nginx 开机自动启动工具:WinSW-x64

    步骤5:启动和管理服务 你可以通过"服务"管理工具或命令行工具(如`net start nginx`和`net stop nginx`)来启动、停止或查看Nginx服务的状态。 总结来说,WinSW-x64为Windows用户提供了方便的工具,使得Nginx能够...

    使用Windows Service Wrapper为nginx添加服务

    这样,nginx就可以像其他Windows服务一样启动、停止、暂停和恢复,而无需手动操作。 接下来,我们将详细步骤分解如下: 1. 下载Windows Service Wrapper:你需要找到适用于你的系统的WSW版本,通常包括wsw.exe和...

    windows版本编译配置好nginx

    在本文中,我们将深入探讨如何在Windows环境下配置和编译Nginx,特别是与RTMP模块集成,以创建一个实时流媒体服务器。Nginx是一个高性能的Web服务器和反向代理,而RTMP模块则使其能够处理实时流媒体内容。 首先,让...

    nginx windows服务安装管理器

    ::通过本管理器可以实现nginx系统服务的安装卸载,启动和关闭 ::xiangyuecn编写,学习nginx之用,还没弄懂怎么配置nginx,先把安装问题先解决了,不然服务器一注销nginx也自动关掉了 ::...

    Windows下Nginx和php-cgi的bat批处理快速启动方法

    创建两个批处理文件,分别用于启动和关闭Nginx和PHP-CGI。 **start_nginx.bat:** ```batch @echo off cd /d C:\nginx start nginx.exe ``` **start_php_cgi.bat:** ```batch @echo off cd /d C:\php ...

    Windows平台,Nginx配置文件修改自动加载重启

    在Windows平台上,使用Nginx作为Web服务器时,配置文件的管理和更新是日常运维工作的重要环节。当Nginx的配置文件被修改后,通常需要手动执行`nginx -s reload`命令来使改动生效,这在频繁调整配置时可能会显得繁琐...

    nginx.service——nginx开机自启动配置文件[CentOS 7.6 64位]

    nginx开机自启动配置文件,在[CentOS 7.6 64位]系统下运行正常。 编译安装nginx后,将该配置文件放在服务器的/usr/lib/systemd/system/目录下,然后启动nginx服务。

    windows下将nginx和tomcat设置为自动启动.rar

    在Windows操作系统中,为了确保web服务的稳定性和连续性,常常需要将常用的服务如Nginx和Tomcat配置为自动启动。这样,当系统重启时,这些服务会自动运行,无需手动启动,极大地提高了运维效率。本教程将详细介绍...

    windows 下 nginx 日志切割

    windows 下nginx 日志切割 结合windows任务计划,实现每天备份日志,并reopen nginx

    windows下配置nginx反向代理tomcat

    在 Windows 环境下配置 Nginx 作为 Tomcat 的反向代理服务器是一项常见的任务,主要用于实现负载均衡、提高安全性及提升性能等目的。本文将从下载 Nginx 开始,详细介绍如何在 Windows 系统上完成这一配置。 #### ...

    windows配置nginx实现负载均衡集群

    【Windows环境下配置Nginx实现负载均衡集群】 在IT领域,负载均衡是一种常见的技术,用于在多台服务器间分配网络流量,以提高系统的可用性和响应速度。通常,Linux是实现负载均衡的主流平台,但Windows环境下的配置...

Global site tag (gtag.js) - Google Analytics