无法使用 sudo 启动服务,因为 root 用户无权访问 Ruby

2024-01-07

tl;dr
尝试运行需要 ruby​​ 才能运行的服务。但是,Ruby 安装的是RVM http://beginrescueend.com/root 用户似乎无法访问它,从而产生错误/usr/bin/env: ruby: No such file or directory. rvmsudo不起作用。

背景
我有一个init.d应该启动的脚本独角兽服务器 http://unicorn.bogomips.org/。我将脚本保存在config我的 Rails 应用程序的目录及其符号链接/etc/init.d/busables_unicorn.

$ ls -l /etc/init.d/busables_unicorn
-> lrwxrwxrwx 1 root root   62 2012-01-12 15:02 busables_unicorn -> /home/dtuite/dev/rails/busables/current/config/unicorn_init.sh

该脚本(附加到底部)本质上只是运行以下命令:

$APP_ROOT/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb -E production

where $APP_ROOT是我的 Rails 应用程序根目录的路径。每次在 init.d 脚本中执行该命令时,都应该按照dtuite(我的部署)用户。为了实现这一点,我打电话给su -c "$CMD" - dtuite而不仅仅是$CMD.

/bin/unicorn是一个“binscript”,它是由Bundler http://gembundler.com/ and config/unicorn.rb包含一些传递给它的配置选项。

独角兽 binscript 如下所示:

#!/usr/bin/env ruby
#
# This file was generated by Bundler.
#
# The application 'unicorn' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

load Gem.bin_path('unicorn', 'unicorn')

现在,我尝试通过运行以下命令来启动我的独角兽服务:

sudo service busables_unicorn start

然而,这会产生错误:

/usr/bin/env: ruby: No such file or directory

我相信发生这种情况是因为我以 root 用户身份运行该服务,但 RVM 已在以下位置安装了 rubydtuite用户的主目录,root 用户无权访问它。

dtuite@localhost:$ which ruby
-> /home/dtuite/.rvm/rubies/ruby-1.9.3-p0/bin/ruby
dtuite@localhost:$ su
Password: 
root@localhost:$ which ruby
root@localhost:$

Question
我需要做什么才能使这项工作成功?

My Setup
- Ubuntu 11.10
- ruby​​ 1.9.3p0(2011-10-30 修订版 33570)[i686-linux]
- nginx:nginx版本:nginx/1.0.5

我尝试过的

rvmsudo https://stackoverflow.com/questions/3644897/rvm-cannot-use-ruby-with-sudo

$ rvmsudo service busables_unicorn start
/usr/bin/env: ruby: No such file or directory

rvm 自动 ruby https://stackoverflow.com/questions/8819096/how-do-i-reference-the-local-ruby-in-a-hash-bang-executable

$ sudo service cakes_unicorn start
-> [sudo] password for dtuite: 
-> -su: /home/dtuite/dev/rails/cakes/current/bin/unicorn: rvm-auto-ruby: bad interpreter: No such file or directory

这另一个问题 https://stackoverflow.com/questions/3230404/rvm-and-thin-root-vs-local-user可能有帮助,但说实话我不太明白。

Appendix
The busables_unicorn完整的脚本。

# INFO: This file is based on the example found at
# https://github.com/defunkt/unicorn/blob/master/examples/init.sh
# Modifications are courtesy of Ryan Bate's Unicorn Railscast
# Install Instructions:
# sudo ln -s full-path-to-script /etc/init.d/APP_NAME_unicorn
# Once installed, an app's unicorn can be reloaded by running
# sudo service APP_NAME_unicorn restart

#!/bin/sh
set -e
# Example init script, this can be used with nginx, too,
# since nginx and unicorn accept the same signals

# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}

APP_ROOT=/home/dtuite/dev/rails/busables/current
PID=$APP_ROOT/tmp/pids/unicorn.pid
# in order to access this, we need to first run
# 'bundle install --binstubs'. THis will fill our
# app/bin directory with loads of stubs for executables
# this is the command that is run when we run this script
CMD="$APP_ROOT/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb -E production"
# we don't need an init config because this file does it's job
action="$1"
set -u

old_pid="$PID.oldbin"

cd $APP_ROOT || exit 1

sig () {
    test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
    test -s $old_pid && kill -$1 `cat $old_pid`
}

case $action in
start)
    sig 0 && echo >&2 "Already running" && exit 0
  # NOTE: We have to change all these lines.
  # Otherwise, the app will run as the root user
  su -c "$CMD" - dtuite
    ;;
stop)
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
force-stop)
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
restart|reload)
    sig HUP && echo reloaded OK && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
  su -c "$CMD" - dtuite
    ;;
upgrade)
    if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
    then
        n=$TIMEOUT
        while test -s $old_pid && test $n -ge 0
        do
            printf '.' && sleep 1 && n=$(( $n - 1 ))
        done
        echo

        if test $n -lt 0 && test -s $old_pid
        then
            echo >&2 "$old_pid still exists after $TIMEOUT seconds"
            exit 1
        fi
        exit 0
    fi
    echo >&2 "Couldn't upgrade, starting '$CMD' instead"
  su -c "$CMD" - dtuite
    ;;
reopen-logs)
    sig USR1
    ;;
*)
    echo >&2 "Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"
    exit 1
    ;;
esac

这听起来像su不会生成一个读取通常设置 rvm 环境的配置文件的 shell。

我会尝试更改您运行的命令

 source "/home/dtuite/.rvm/scripts/rvm" && $APP_ROOT/bin/unicorn...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 sudo 启动服务,因为 root 用户无权访问 Ruby 的相关文章

  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • 我在 Rails 中使用了保留字吗?

    这是我的模型 class Record lt ActiveRecord Base belongs to user belongs to directory end class Directory lt ActiveRecord Base h
  • 在 bash 中使用单个命令为 shell 变量分配默认值

    我对 bash 3 00 shell 脚本中的变量进行了大量测试 如果未设置变量 则它会分配默认值 例如 if z VARIABLE then FOO default else FOO VARIABLE fi 我似乎记得有一些语法可以在一行
  • 已定义方法的 Ruby 钩子?

    我一直在谷歌上搜索这个问题 但找不到答案 这让我认为答案是否定的 但我想我会在这里问 以防有人确切知道 Ruby 是否有一个钩子来定义方法 即在模块或类上 如果没有 是否有人足够熟悉该实施的情况main对象以了解它到底如何将方法复制到Obj
  • 在 Ruby 中创建一个空文件:相当于“touch”?

    创建一个的最佳方式是什么emptyRuby 中的文件 类似于 Unix 命令的东西 touch https en wikipedia org wiki Touch 28Unix 29 touch file txt FileUtils tou
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • if [ -z "${FILE_LIST}" ] 中的 -z 是什么

    遇到了这个 什么是 z在 shell 脚本中if z FILE LIST 是相同的test And man test gives z STRING the length of STRING is zero 注意 在某些平台上 是一个符号链接
  • 使用 g++ 5.3.1 编译的程序运行速度比使用 g++ 4.8.4 编译的相同程序慢 3 倍,相同的命令

    最近 我开始使用 Ubuntu 16 04 和 g 5 3 1 并检查我的程序是否运行慢3倍 在此之前我使用过 Ubuntu 14 04 g 4 8 4 我用相同的命令构建它 CFLAGS std c 11 Wall O3 我的程序包含循环
  • 什么是适合 Rails 3 的测试框架?

    去年我一直在使用 Ruby On Rails 但是 无法进行单元测试 现在我必须编写单元测试代码 哪个测试框架好 为什么 有这方面的好的教程吗 我的系统配置 Ruby 1 9 2 Rails 3 Ubuntu 10 第一个技巧是 尝试升级到
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 如何使用shell脚本从json字符串中grep特定字段值[重复]

    这个问题在这里已经有答案了 下面是文件中可用的 JSON 字符串 我需要从中提取值status在 shell 脚本中 预期输出 status success 响应 json eventDate null dateProccessed nul
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma

随机推荐

  • 如何测试所需的init(coder:)?

    在我的定制课程中WLNetworkClient我必须实现这样的方法 required init coder aDecoder NSCoder fatalError init coder has not been implemented 我不
  • Metro 的东西在什么桌面上运行?

    只是好奇 从 WinAPI 开发人员的角度来看 什么desktop http msdn microsoft com en us library ms682573 28v vs 85 29 aspxMetro 应用程序可以运行吗 这个东西 我
  • Spring 5 Web Reactive - 热门发布 - 如何使用 EmitterProcessor 将 MessageListener 桥接到事件流

    示例项目位于此处 https github com codependent spring5 playground https github com codependent spring5 playground 我想将从 JMS 队列接收到的
  • iOS 中如何锁定屏幕使其只有纵向方向?

    我创建了一个具有许多视图的应用程序 并且我希望其中一些视图仅处于纵向方向 我已将其编码在 m 文件中 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation in
  • 如何使 android-wheel 水平?

    我正在尝试从http code google com p android wheel http code google com p android wheel 并使其水平显示 我的第一次尝试来自于作者本人的建议http android de
  • 如何仅使用 sscanf 从字符串中提取所有数字?

    如何在 C 语言中使用 sscanf 从以下格式的字符串中提取所有数字 3 2 4 5 10 空格可以无处不在 但当然不能在数字之间 每个位置可以有 0 个或更多空格 字符串必须具有正确的格式 否则会出现错误 例如 3 2 是一个错误 每个
  • AWS:为什么我的 RDS 实例在关闭后仍继续启动?

    我在 AWS 上有一个 RDS 数据库实例 目前已将其关闭 但是 每隔几天它就会自行启动 我现在没有任何其他服务正在运行 我的 RDS 日志中有此事件 数据库实例正在启动 因为它超出了允许的最大停止时间 为什么我的 RDS 实例的停止时间有
  • 在 PHP 和 Eclipse 中设置路径映射

    我刚刚在本地设置了我的网站 这样我就可以更轻松地测试我的页面 Eclipse 已配置为在本地使用 XAMPP 服务器 问题是我想将我的项目映射到网站中的某个位置 IE 在我的 Eclipse PHP 项目中 我有一个名为 com 我想要这个
  • 渲染发生后以编程方式应用 jquery(移动)CSS 类

    jQuery 移动 http jquerymobile com 会根据内容自动为页面上的元素应用 css 和一些 htmldata 页面加载时属性就在它们上面 我通过 ajax 调用拉入一些 html 内容 但它是在 jquery mobi
  • 以给定概率得出 true 或 false

    我正在尝试用 C 编写一个函数 该函数将根据给定的概率返回 true 或 false 因此 例如 如果给定的概率为 0 634 则该函数有 63 4 的机会返回 true 我尝试了几种不同的方法 但都失败了 有什么帮助吗 如果您想在 C 1
  • 序列化对象时如何忽略事件订阅者?

    当下面的类被序列化时BinaryFormatter 订阅的任何对象Roar事件也将被序列化 因为对这些对象的引用由 EventHandler 委托保存 Serializable public class Lion public event
  • Javascript - 检测阿拉伯文本

    今天我想做一个使用输入文本的阿拉伯语测验 这是我的代码 我知道这仍然是基本的 但问题是它无法检测阿拉伯文本 语言 当我尝试输入 文本时 它显示 错误 警报 我不知道为什么它无法检测到阿拉伯语 有什么解决办法吗 function answer
  • 在MinGW编译器中,-mwindows命令是什么,它有什么作用?

    我在使用 C 程序时遇到问题 当我运行 exe 时 该程序将运行并且该程序的窗口将打开 但控制台将在后台桌面上打开 我进行了谷歌搜索 发现使用 mwindows 命令作为参数进行编译会删除控制台 它确实做到了 但我不确定它实际上是做什么的
  • Xamarin选择TargetFramework和MinimumAndroidVersion

    我正在开发一个 Xamarin Forms 应用程序 目前仅支持 Android 默认设置将 TargetFramework 设置为 7 1 该项目的最低 Android 版本必须为 7 0 这会产生一个警告 Xamarin Forms P
  • Google Analytics iOS SDK [GAIReachabilityCheckerreachabilityFlagsChanged:崩溃

    我的 iOS 应用程序不断遇到与 GAIReachabilityChecker 相关的崩溃 这个函数似乎崩溃了 GAIReachabilityCheckerreachabilityFlagsChanged 这是错误日志 线程 崩溃 com
  • 人行横道的应用程序大小增加了 71mb

    我真的希望我做错了什么 我已将人行横道添加到项目中 并且应用程序大小明显增加 为了测试我做了以下事情 创建了一个新的离子项目 将我的应用程序代码添加到 www 添加了 ngcordova 和各种插件 运行 ionic 构建并将 apk 放到
  • 如何使用 PowerShell 提取 Epub 元数据 (XML)?

    我对 PowerShell 并不陌生 但对 XML 解析很熟悉 基本上我想从 OPF 文件中提取标题 创建者和发布者信息 该文件只是一个 xml 文件 下面这本书是来自 Google 的 epub v3 样本集的 Moby Dick
  • 基于颜色的 OpenCV 边缘/边框检测

    我对 OpenCV 还很陌生 很高兴能了解更多信息 我一直在考虑勾画边缘和形状的想法 我遇到过这段代码 在 iOS 设备上运行 它使用了 Canny 我希望能够以颜色呈现它 并圈出每个形状 有人能指出我正确的方向吗 Thanks IplIm
  • Spring REST 和 PATCH 方法

    我正在使用 SpringBoot 和 Spring REST 我想了解 HTTP PATCH 方法来更新我的模型的属性 有没有好的教程解释如何使其发挥作用 HTTP PATCH 方法和要发送的正文 控制器方法以及如何管理更新操作 我注意到许
  • 无法使用 sudo 启动服务,因为 root 用户无权访问 Ruby

    tl dr尝试运行需要 ruby 才能运行的服务 但是 Ruby 安装的是RVM http beginrescueend com root 用户似乎无法访问它 从而产生错误 usr bin env ruby No such file or