【问题标题】:Centos systemctl startup script - Ruby bad interpreterCentos systemctl 启动脚本 - Ruby 错误解释器
【发布时间】:2019-03-11 21:24:21
【问题描述】:

当 systemctl 尝试运行我的启动脚本时出现以下错误

/usr/bin/startup/status_start.sh: /usr/local/bin/procodile: /usr/bin/ruby: bad interpreter: No such file or directory

这是我的开始脚本

#!/usr/bin/bash
cd /opt/staytus/staytus/
procodile start

现在我假设这与 bash shell 和 PATH 等有关,但我不太了解那个世界:)

我已经用 #!/usr/bin/bash 和 #!/bin/bash 尝试了我的启动脚本

还有其他建议吗?


更新 1:

在我的脚本中添加了一行以打印出导致以下错误的“which ruby​​”

Oct 06 17:31:02 status.sh[11014]: which: no ruby in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)

这导致我添加更多

echo "current path:" $PATH
PATH=/opt/staytus/.rbenv/shims/ruby:$PATH
echo "new path:" $PATH

但尽管我尝试过,但 systemctl 运行 start 时仍然出现错误...

Oct 06 17:45:37 start.sh[2878]: current path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Oct 06 17:45:37 start.sh[2878]: new path: /opt/staytus/.rbenv/shims/ruby:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Oct 06 17:45:37 start.sh[2878]: /usr/bin/startup/start.sh: /usr/local/bin/procodile: /usr/bin/ruby: bad interpreter: No such file or directory

更新 2

这是 systemctl 脚本

[Unit]
Description=Starts up procodile which runs staytus

[Service]
User=staytus
Type=simple
WorkingDirectory=/opt/staytus/staytus/
ExecStart=/usr/bin/startup/start.sh
ExecStop=/usr/bin/startup/stop.sh
# Restart=on-abort

[Install]
WantedBy=multi-user.target

以 root 身份运行版本时,保持原样

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

Ruby 似乎已安装在

which ruby
~/.rbenv/shims/ruby

更新 3:

好的,所以我决定通过另一个脚本将似乎缺少的路径流添加到我的脚本中,该脚本打印通过 eval 命令设置环境的命令

path.sh

#!/bin/sh
echo export PATH=/opt/staytus/bin/procodile:/opt/staytus/.rbenv/shims/ruby:/usr/lib64/ruby:/usr/share/ruby:/usr/bin/bash:$PATH

start.sh

#!/usr/bin/env bash
set -xv
whoami
echo "current path:" $PATH
cd /opt/staytus/staytus/
pwd
eval `/usr/bin/startup/path.sh`
echo "New path:" $PATH
procodile start

【问题讨论】:

  • 那么你的系统上没有安装 ruby​​,它没有安装。 procodile 是用 ruby​​ 编写的
  • Ruby 已安装 - 脚本单独运行良好,它只是一个 systemctl 的东西
  • 你能发布 systemctl 服务文件吗?您可以将/usr/bin/ruby --version 作为 systemctl 服务文件中的 ExecStart 运行吗?如果您从脚本文件中运行/usr/bin/ruby --version 会怎样?您是否在 /usr/bin/ruby 中安装了 ruby​​?是符号链接吗?如果您从脚本中执行ruby procodile start 会怎样?
  • 更新细节 - 奇怪的是直接运行脚本但 ruby​​ procodile start 不能,但 procodile start 单独可以......?似乎与 procodile 相似 .... which procodile /opt/staytus/.rbenv/shims/procodile
  • 我怀疑head -n 1 $(which procodile) 会告诉你这个问题,这个程序期望在某个地方找到红宝石,但事实并非如此。如果您希望它作为系统服务运行,您确实应该将 ruby​​ 安装在适当的位置,即/usr/bin

标签: bash shell path centos7


【解决方案1】:

你的一个脚本——可能是/usr/local/bin/procodile,但可能是它调用的东西——以#!/usr/bin/ruby开头。

但是,您的 Ruby 解释器没有安装/usr/bin/ruby,所以会中断。

找到负责的脚本,并将其第一行更改为 #!/usr/bin/env ruby,这将遵循 PATH 以查找要运行的解释器。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2020-01-04
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多