在lighttpd中执行ruby脚本找不到依赖的fcgi库

lighttpd+ruby+fcgi是一种常用的web开发组合,其安装和配置可以参考 mac os 下 ruby+lighttpd+fcgi 安装
现在有一个存量的项目(就是之前就开发好了),迁移到新的mac上执行,启动lightpd:

sudo lighttpd -D -f lighttpd.conf

发现错误:

main_service.rb:3:in `require'main_service.rb:3:in `require': : no such file to load -- fcgino such file to load -- fcgi ( (LoadErrorLoadError)

这个错误的意思是说找不到fcgi库,但是在命令行执行查询安装的gem,发现fcgi已经安装了:

sudo gem list

*** LOCAL GEMS ***

bundler (1.0.21)
fcgi (0.8.8)
mysql (2.8.1)
rake (0.9.2.2)
rubygems-bundler (0.2.7)
rvm (1.9.2)

但是怎么会找不到呢?写一个例子程序,执行起来是没问题的:

vi /tmp/test.rb

require 'fcgi'

ruby /tmp/test.rb

想起系统中有两个ruby版本(通过rvm管理的),是不是用错了ruby版本?ruby脚本在lihttpd中执行,是用的哪个ruby呢?我注意到了ruby脚本中的第一行:

#!/usr/bin/ruby

对了,用的是这个ruby,这个是系统的ruby,不是我需要的。因此需要将所有文件的这一行修改为对应的ruby路径。但是不要着急修改,我们发现这个问题是不同系统上ruby程序在不同位置导致的,因此你这样修改了,无法保证下次到另外一个机器上能正常工作。
有一种方法是创建一个链接到系统的ruby程序,然后在我们代码中写这个链接的路径。以后移植到别的机器执行,若ruby位置不是我么期望的,则创建该链接即可。

ln -s ~/.rvm/rubies/ruby-1.9.3-p125 /usr/local/ruby

上面代码将系统的ruby链接到 /usr/local/ruby,这样将脚本修改为:

#!/usr/local/ruby/ruby

PS:
#!/usr/local/ruby 写过shell脚本的人都知道:#!/bin/bash,这个意思是告诉系统下面的代码用哪个程序解析。当我们使用 bash a.sh执行一个脚本时候,写不写这样都无所谓;但是当我们使用 sudo ./a.sh来执行这个脚本的时候,就必须要写这行了。
其实#!/bin/bash是很有用的,他是用来指定接下来的脚本是用那个程序来解析。如你可以在你的shell脚本中插入 #/bin/awk ,则是告诉系统下面的脚本用awk来解析。

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2012-2017 YUNWEIPAI.COM - 运维派 - 粤ICP备14090526号-3
扫二维码
扫二维码
返回顶部