无法使用 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 的相关文章

  • Rails:渲染不起作用,仍然出现“模板丢失”

    我目前正在学习 Rails 指南 我完成了这些步骤 但仍然遇到错误 我的 Ruby 版本是ruby 2 1 1p76Rails 版本是4 0 4 按照指南的指示 我创建了一个Article Controller class Articles
  • 如何使用 Ruby 2.7.0 修复 Rails 的警告消息

    有没有人解决这个问题Ruby 2 7 0 I used rbenv并安装了 Ruby v2 7 0 然后使用创建了一个 Rails 项目Rails v6 0 2 1 目前 通过运行之一 rails s rails s u puma rail
  • 无需别名的 Ruby YAML 编写

    我正在从 ruby 将数据写入 yaml 文件 并且经常在该文件上添加别名 像 id001 somekey somevalue id001 就我而言 我使用 yaml 文件来aid可读性并将名称添加到文件中的值 因为现有数据只是 没有键的分
  • 由于符号链接错误,无法在 Mac OSX 10.8.1 中安装 ruby​​-1.9.2

    首先 我尝试了常见的rvm安装 rvm安装1 9 2 但是 显示了以下错误 The provided compiler usr bin gcc is LLVM based it is not yet fully supported by r
  • 退出代码大于 255 — 可能吗?

    如果是 在哪个操作系统 shell 或其他操作系统上 考虑以下 Java 程序 我使用 Java 只是作为示例 任何语言都适合这个问题 这更多地与操作系统有关 public class ExitCode public static void
  • vim 中的 python 2 支持

    我正在尝试设置 YouCompleteMe 一个 vim 代码完成插件 当我运行 vim 时 它给我这个错误消息 YouCompleteMe unavailable 需要 python 2 x 我的 ubuntu 机器上安装了正确版本的 p
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 从类内部调用属性访问器方法[重复]

    这个问题在这里已经有答案了 我正在尝试调用我的类属性编写器之一 但由于某种原因它永远不会被调用 下面是一些代码 可以使这一点更清楚 class Test attr reader test def test val puts Called t
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何使用 docker ENTRYPOINT 与 shell 脚本文件组合参数

    我编写 shell 脚本文件并将其与 docker ENTRYPOINT 一起使用 但是当我运行 docker image 时 由于入口点代码行 它只是停止而没有任何错误日志 我的 Dockerfile FROM ubuntu 16 04
  • Ruby mp3 Id3 解析

    目前我正在从事一个音乐项目 处理用户 mp3 上传 问题是我找不到适用于所有文件的 id3 库 我努力了id3 ruby and Mp3Info库 但它们都没有给我一致正确的结果 例如 最常见的问题 错误的流参数 比特率和采样率 有时是持续
  • Ruby 可选参数和多个参数

    我试图将方法的第一个参数设置为可选 后跟任意数量的参数 例如 def dothis value 0 args 我遇到的问题是 这似乎实际上不可能 当我打电话时dothis hey how are you good 我希望它将值设置为默认值
  • 什么是 - 获取的是一个目录 - 错误消息

    我收到这个奇怪的错误 Users gideon Documents ca ruby rubytactoe lib player rb 13 in gets Is a directory spec Errno EISDIR 玩家规格 rb r
  • 有没有可以在 HTML 文档之间进行比较的 ruby​​ gem?

    事实证明 对两个不同的 html 文档进行比较是一个完全不同的问题 而不仅仅是对纯文本进行比较 例如 如果我在以下之间进行简单的 LCS 差异 Google and Google diff 结果不是 but a gt github com
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • 如何从 LaTeX 执行 shell 脚本?

    我正在尝试在 LaTeX 中执行以下操作 documentclass article begin document execute usr local bin my shell script sh end document 想法是执行 us
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 安装 scrapy 0.22 时出错(在 Ubuntu 12.04 上):“gcc”失败,退出状态为 1

    尝试使用 pip 从命令行安装 Scrapy 时 sudo pip install scrapy我收到以下错误 error command gcc failed with exit status 1 查看错误输出中的几行 我发现在尝试安装
  • 在 VBA 中捕获 shell 命令的输出值?

    发现这个功能http www cpearson com excel ShellAndWait aspx http www cpearson com excel ShellAndWait aspx 但我还需要捕获 shell 的输出 有什么代

随机推荐

  • 如何测试所需的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