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来解析。
本文链接:http://www.yunweipai.com/142.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/53115.html