【问题标题】:Commands not working inside shell script but working directly on the console命令不在 shell 脚本中工作,但直接在控制台上工作
【发布时间】:2022-02-01 20:16:42
【问题描述】:

所以我有这个我想在脚本中运行的命令:

pm2 restart my-application --update-env

我的脚本:

#!/bin/bash

sudo -u deploy bash << EOF
cd /home/deploy/my-agent
pm2 start ecosystem.json
EOF
echo "out of the deploy user"

echo "export edgeboxId=$edgeboxId">> /etc/bash.bashrc

sudo -u edgebox bash << EOF
pm2 restart my-application --update-env 
EOF
echo "out of application user"
sleep infinity

此命令pm2 restart my-application --update-env 在脚本中没有按预期工作(它应该更新 pm2 的 env,但它会在不更新 env 的情况下重新启动应用程序)。它也不会抛出任何错误。命令的输出是:

[PM2] Applying action restartProcessId on app [my-application](ids: [ 0 ])

[PM2] [my-application](0) ✓

┌─────┬───────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name                      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ my-application    │ default     │ 1.0.328 │ fork    │ 348      │ 0s     │ 2    │ online    │ 0%       │ 20.9mb   │ edgebox  │ disabled │
└─────┴───────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

但是当我直接在控制台上运行这个命令时,它按预期工作。所以我的问题是,如何使这个命令在脚本内部工作?它看起来像一些 shell 问题,但我无法弄清楚。

注意:此命令和脚本在 docker 容器内运行,docker 容器内的 shell 为 /bin/bash,版本为 5.0.3(1)-release

【问题讨论】:

  • 命令不起作用是什么意思? echo $BASH_VERSION 说什么?命令的退出代码是什么?
  • @user1934428 我已经更新了问题。
  • 我没有在您的更新中看到您获得的退出代码。此外,&gt;&gt; /etc/bash.bashrc 很显眼。我原以为您没有此文件的写权限。之后我会做一个cat /etc/bash.bashrc 来验证这一点。
  • 没有退出代码,因为最后一个命令是sleep forever!?我可以在/etc/bash.bashrc看到我的变化@

标签: linux bash shell environment-variables pm2


【解决方案1】:

您可以启动pm2,因为它的位置是$PATH 变量的一部分。 $PATH 变量取决于用户。
因此,当您执行sudo 时,您切换到另一个用户,这意味着另一个$PATH 变量,因此pm2 的位置可能不存在。

为了解决这个问题,请在命令提示符下切换到该用户并调整 $PATH 环境变量(以持久的方式)。

【讨论】:

  • root 和 edgebox 用户都在使用相同的 pm2。我使用命令 which pm2 检查了 pm2 路径,对于两个用户,命令输出都是 /usr/local/bin/pm2
  • 在这种情况下,OP会收到一条错误消息,但他明确表示没有消息。
  • @Anudocs:为了检查命令的有效性,which 是一个糟糕的选择,因为它不会显示同名函数是否隐藏了命令。更好的选择是type -a pm2。此外,请更新您的问题,以便我们可以看到您将调试命令的确切位置,以便我们可以看到您已将它们放置在合理的位置。
最近更新 更多