【发布时间】: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。