【问题标题】:Bash script doesn't run on bootupBash 脚本在启动时不运行
【发布时间】:2012-03-21 17:28:42
【问题描述】:

我为两个项目编写了一个 bash 脚本来启动瘦服务器。

#! /bin/sh
cd /path/to/my/project_1
thin -e production -p 3000 --daemonize -s 10 start

然后将其放在 /etc/init.d/start_thin 中。给它755个权限。冉:

sudo update-rc.d  start_thin defaults.

然后

sudo reboot

Thin 未启动。谢谢。

更新:

经过长时间的斗争,我发现了这个只有在使用 /etc/init.d/thin 启动瘦时才会发生的错误

将 PID 写入 tmp/pids/thin.3000.pid 使用 rails 适配器 /path/.rvm/gems/ruby-1.9.2-p290/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] 分割错误 ruby​​ 1.8.7 (2010-08-16 patchlevel 302) [i686-linux]

我想现在唯一合乎逻辑的事情就是切换到“正常”的 sql gem。

更新 2:

我找到了this resource,以前对我有帮助,但现在无能为力了。

更新 3:

我使用 quick install 重新安装了 RVM。现在,当启动脚本运行时,我在日志中看到缺少 gem:multi_json-1.1.0。我安装它并放入 Gemfile。没有帮助。不过,当我手动执行 bash 脚本时 - 没问题。只有在启动时它才会抱怨 multi_json-1.1.0。

更新 4:

只有在启动时,thin 的日志文件包含:

当我安装了 ruby​​ 1.9.2 时,我不明白为什么它使用 1.8 gems :-?

>> Writing PID to tmp/pids/thin.3000.pid
>> Using rails adapter
>> Exiting!
/usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/spec_set.rb:87:in `materialize': Could not find multi_json-1.1.0 in any of the sources (Bundler::GemNotFound)
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/spec_set.rb:81:in `map!'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/spec_set.rb:81:in `materialize'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/definition.rb:90:in `specs'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/definition.rb:135:in `specs_for'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/definition.rb:124:in `requested_specs'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/environment.rb:23:in `requested_specs'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/runtime.rb:11:in `setup'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler.rb:107:in `setup'
        from /usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib/bundler/setup.rb:17
        from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
        from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
        from /home/user1/myproj1/config/boot.rb:6
        from /home/user1/myproj1/config/application.rb:1:in `require'
        from /home/user1/myproj1/config/application.rb:1
        from /home/user1/myproj1/config/environment.rb:2:in `require'
        from /home/user1/myproj1/config/environment.rb:2
        from /usr/lib/ruby/1.8/rack/adapter/rails.rb:42:in `require'
        from /usr/lib/ruby/1.8/rack/adapter/rails.rb:42:in `load_application'
        from /usr/lib/ruby/1.8/rack/adapter/rails.rb:23:in `initialize'
        from /usr/lib/ruby/1.8/rack/adapter/loader.rb:36:in `new'
        from /usr/lib/ruby/1.8/rack/adapter/loader.rb:36:in `for'
        from /usr/lib/ruby/1.8/thin/controllers/controller.rb:163:in `load_adapter'
        from /usr/lib/ruby/1.8/thin/controllers/controller.rb:67:in `start'
        from /usr/lib/ruby/1.8/thin/runner.rb:174:in `send'
        from /usr/lib/ruby/1.8/thin/runner.rb:174:in `run_command'
        from /usr/lib/ruby/1.8/thin/runner.rb:140:in `run!'
        from /usr/bin/thin:6

所以,很自然,我安装了 multi_json gem,然后,捆绑安装,你怎么看?同样的老问题:)。

【问题讨论】:

  • 尝试./thin,如果它位于该目录中。很可能它不在 PATH 中。
  • 谢谢,我尝试过,并再次尝试提供完整路径。没有运气。
  • 一个问题是 cd 在子外壳中运行。但问题是从薄开始。我检查了日志,一切看起来都很好。所以应该是其他问题。目前我从 Thin -c /path/to/my/project_1 -e production -p 3000 --daemonize -s 10 start 开始
  • 你可以试试sudo start start_thinsudo restart start_thin。您不需要重新启动来测试您的脚本(这不是 Windows)。
  • 在这种情况下,当您执行脚本时,会生成一个新的 shell。在这个新的 shell 中,您执行cd 命令,然后执行thin 命令。其他问题不相关。

标签: ruby-on-rails boot restart thin


【解决方案1】:

试试sudo chmod u+x /etc/init.d/start_thin

【讨论】:

  • 它已经拥有 755 个权限。它在启动时运行,我也可以用 (.) 点 start_thin 运行它。我可以看到它输出“Starting thin on port ...”消息。但是要么只有在启动时才会杀死它,而且我怀疑环境有问题。
【解决方案2】:

从表面上看,thin 是以一种相当混乱的方式开始的,使用 ruby​​ 1.8.7 解释器,但使用为 1.9.2 编译的 gem,这听起来是个非常糟糕的主意。听起来 rvm 设置不正确

先尝试加载 rvm。如果您在全局范围内安装了 rvm,则可以使用

source /etc/profile.d/rvm.sh

如果不是,请更改该路径以反映运行此脚本的用户的 rvm 安装位置。

rvm 也需要 bash,因此请确保您的 shebang 是 /bin/bash 而不是 /bin/sh(有时 sh 只是指向 bash 的符号链接,但您不应该依赖它)

【讨论】:

  • 谢谢!我按照你说的做了,还是不行。我还读到 RVM 有很多错误,可能早期版本的 Ruby 应该可以更好地工作。我正在考虑从头开始重新安装它。
【解决方案3】:

我找到了答案here

将这些行添加到我的 bash 脚本的开头:

# Load RVM into a shell session *as a function*
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then

  # First try to load from a user install
  source "$HOME/.rvm/scripts/rvm"

elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then

  # Then try to load from a root install
  source "/usr/local/rvm/scripts/rvm"

else

  printf "ERROR: An RVM installation was not found.\n"

fi

rvm use 1.9.2

为了检查一切是否正确,在 bash 内部以及我使用的上述代码的正下方

type rvm | head -1

如果上面的输出:rvm 是一个函数,那么一切都很好。

注意:如果出于某种原因它们似乎不适用于 RVM,则同样的事情应该转到 cron 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2020-04-20
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多