`
CharlesCui
  • 浏览: 427835 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Siantra没有后台模式?Webrick源码中server.rb里后台进程的实现很简洁

阅读更多
Windows里面写好Sinatra的代码传到Unix上面,
chmod +x之后直接运行脚本报错:
: bad interpreter: No such file or directory
这是由于该文件是以DOS格式编辑的,Unix不认识,我们需要转换一下。

用Vi打开,
:set ff?查看一下是不是Dos的,
set ff=unix转换成Unix,
然后再运行下试试。

Sinatra没找到如何以后台模式启动,可能这不在它要考虑的范围内吧。
把下面这段Webrick的守护进程代码加进去,
最后再加上一句:
Daemon.start就OK了。

ps -ajx看一下:

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1 15755 15754 15754 ?           -1 S        0   0:00 /usr/local/bin/ruby ./server.rb

典型的守护进程:)

  class Daemon
    def Daemon.start
      exit!(0) if fork
      Process::setsid
      exit!(0) if fork
      Dir::chdir("/")
      File::umask(0)
      STDIN.reopen("/dev/null")
      STDOUT.reopen("/dev/null", "w")
      STDERR.reopen("/dev/null", "w")
      yield if block_given?
    end
  end


用的时候抄一下就行,哈哈哈哈。

不过要理解守护进程的实现原理,请只会傻写Java代码的同学们看《UNIX环境编程》 :)

================整理下之后==============

#!/usr/local/bin/ruby
require 'rubygems'
require 'sinatra/base'
require 'rack'
require 'open3'

$build_sh = File.join("/home/admin/taiji/src/taiji/src/task","build.rb")

class TaijiBuilderServer < Sinatra::Base
	get '/taiji' do
		"{stat:'Running'}"
	end

	get '/taiji/build' do
		if (params[:project_name] && params[:svn] && params[:project_id]) != nil then
			#另起一个进程处理更新SVN和编译以及部署、启动等操作,不能在Sinatra同进程中进行!
			Open3.popen3 %Q{ruby #{$build_sh} #{params[:project_name]} #{params[:svn]} #{params[:project_id]}}
			"{stat:'OK',params:'#{Rack::Request.new(env).params.inspect}',ts:'#{Time.now().to_s}',cmd:'ruby #{$build_sh} #{params[:project_name]} #{params[:svn]} #{params[:project_id]}'}"
		else
			"{stat:'Params Error'}"
		end
	end
end

class Daemon
    def Daemon.start
      exit!(0) if fork
      Process::setsid
      exit!(0) if fork
      Dir::chdir("/")
      File::umask(0)
      STDIN.reopen("/dev/null")
      #以下两个日志需要以a(追加)的方式打开日志文件,w将清空原有内容
      #输出Sinatra默认输出
      STDOUT.reopen("/home/admin/taiji/logs/build_stdout.log", "a+")
      #输出Error日志
      STDERR.reopen("/home/admin/taiji/logs/build_stdout.log", "a+")
      yield if block_given?
    end
end

#启动精灵进程的同时启动Sinatra应用
Daemon.start{TaijiBuilderServer.run! :host => '10.2.226.20', :port => 9090}


翻了下以前的代码,发现Sinatra也可以这样使用:
Rack::Handler::Mongrel.run builder, :Port => 9292

这样的话估计会有原生的Mongrel或者Thin等守护进程的实现,

没必要为了实现一个小功能浪费那么多时间去学习了,我成不了专家,也没这打算。
分享到:
评论

相关推荐

    Webrick rails外部电脑访问慢

    在使用Webrick作为Rails服务器的过程中,很多开发者遇到了一个常见的问题:当尝试从外部电脑访问Webrick服务器时,访问速度变得异常缓慢。这给开发和测试带来了很大的不便。 #### 问题分析 在Webrick中,默认情况...

    ruby example webrick

    ruby sample: @echo off cd D:\proj\demo rem previously drop tables call rake db:migrate VERSION=0 rem load test data (it depends on the db:environment and db:...call ruby script/server webrick @echo on

    RailsLite:Rails lite是轻量级的Rails克隆

    Rubybin / basic_server.rb Rubybin / controller_server.rb Rubybin / params_server.rb Rubybin / router_server.rb Rubybin / session_server.rb Rubybin / template_server.rb 玩得开心! 如何使用 您...

    WebServer_v19_HTTP_wevl3_web_server服务器源码_

    【WebServer_v19_HTTP_wevl3_web_server服务器源码】是一个基于HTTP协议的轻量级Web服务器项目,主要用于教学和学习目的。这个项目的核心是实现一个简单的服务端,能够处理来自多个客户端的请求,同时提供一个类似...

    api.tar.gz_in

    `api.rb`很可能是核心的API服务器代码,定义了各种端点和处理程序。在Ruby中,这通常涉及到创建一个类或者模块,该类或模块响应XML-RPC请求,执行业务逻辑,并返回结果。开发者可能会使用XML-RPC库提供的方法来注册...

    Ruby-rubyserver标准文件协议的生产就绪实现

    Ruby服务器通过多线程、多进程或事件驱动(如Reactor模式)等方式实现并发。例如,Puma使用工作进程和线程池来处理请求,既利用了多核CPU,又避免了线程安全问题。 6. **性能优化**: 为了提高性能,Ruby服务器...

    webrick:HTTP服务器工具包

    韦伯里克WEBrick是一个HTTP服务器工具包,可以...安装将此行添加到应用程序的Gemfile中: gem 'webrick' 然后执行: $ bundle或将其自己安装为: $ gem install webrick用法要创建一个新的WEBrick :: HTTPServer,它

    bookinfo-details

    Ruby是一种面向对象的、动态类型的编程语言,因其简洁的语法和强大的元编程能力而受到开发者喜爱。对于"bookinfo-details",我们还需要运行名为`details.rb`的脚本,通过命令行参数`9080`指定服务器监听的端口。 在...

    LearnEnoughActionCabletoBeDangerous的聊天应用程序_Ruby_HTML_下载.zip

    在当今的Web开发中,实时通信功能已经成为许多应用程序不可或缺的一部分,比如在线聊天、实时通知等。Rails框架的ActionCable是实现这些功能的重要工具,它允许开发者轻松创建WebSocket应用程序,提供全双工、低延迟...

    Redmine使用手册.doc

    6. 运行WEBrick服务器来测试安装:ruby script/server -e production 7. 使用默认的用户名和密码登录:用户名:admin 密码:admin 8. 可以到管理&配置界面修改系统的配置参数。 SMTP服务器配置: 在config/...

    在Rails中使用SSL

    Rails框架支持在应用程序中轻松集成SSL,以保护用户敏感信息,如登录凭据和支付详情。以下是一些关于在Rails中实施SSL的关键知识点: 1. **SSL简介**:SSL(Secure Sockets Layer)是一种网络安全协议,用于加密...

    基于Ruby语言的Ruby on Rails项目及其代码方案

    Ruby on Rails是一款使用Ruby语言开发的应用程序框架,其核心是MVC(Model-View-Controller)模式,能够快速高效地构建Web应用。Rails以其简洁、高效著称,被广泛应用于各种规模的Web应用开发中。 #### 二、项目...

    Ruby-Puma一个Ruby的并发Web服务器

    8. **集群模式**:Puma可以通过集群模式进一步提升性能,通过在多个工作进程中分配请求,有效地利用多核处理器。 9. **SSL支持**:Puma可以直接处理HTTPS连接,提供内置的SSL/TLS支持,以确保数据传输的安全性。 ...

    http_server_implementations

    标题中的“http_server_implementations”暗示了我们将探讨如何在Ruby中实现一个HTTP服务器。HTTP服务器是互联网上网站和应用程序的基础,它们负责接收客户端(如浏览器)的HTTP请求,并返回相应的HTTP响应。Ruby...

    mongel for linux安装

    MongoDB是一个高性能、无模式的文档型数据库,广泛应用于Web开发、数据分析、存储大规模数据等场景。在Linux环境下安装MongoDB是很多开发者和系统管理员的日常任务。本篇将详细介绍如何在Linux系统上安装MongoDB,以...

    evanknapke.github.io

    如果收到此错误: /jekyll/commands/serve/servlet.rb:3:in 'require': cannot load such file -- webrick (LoadError) :3: /jekyll/commands/serve/servlet.rb:3:in 'require': cannot load such file -- webrick...

    redmine-3.2.8.tar.gz

    Redmine 是一个开源的项目管理工具,主要用于跟踪和管理软件开发过程中的问题、任务和资源。这个`redmine-3.2.8.tar.gz`压缩包是Redmine的一个特定版本,即3.2.8,它针对的是CentOS操作系统。在安装Redmine于CentOS...

    WebServer_SourceCode_Ruby:Web服务器源代码Ruby版-服务器

    在"WebServer_SourceCode_Ruby-master"这个文件夹中,我们通常会找到项目的主文件,如`server.rb`或`app.rb`,这是服务器的入口点,包含了启动服务器和处理请求的主要逻辑。此外,`config`目录可能包含了配置信息,...

    redmine安装教程

    - 运行Ruby安装程序,确保在安装过程中勾选“Add Ruby executables to your PATH”和“Associate .rb and .rbw files with this interpreter”选项。 - 完成安装后,通过“Start Command Prompt with Ruby”启动...

Global site tag (gtag.js) - Google Analytics