我有一个在启动时从 CentOS 中的 rc.local 运行的脚本。此脚本包含一个命令,用于使用名为 rebar 的第三方构建命令编译我的 erlang 项目。rebar 行在启动时无法编译我的项目,但如果我随后手动运行它,则项目可以正常编译。我认为这是因为 rebar 命令调用了没有绝对路径的其他命令。
如何在启动时运行命令,但在不需要绝对路径的环境中?
我不想修补这个第三方命令(并处理伴随这一混乱而来的不可避免的官僚主义)和/或保留我自己的项目并行分支只是为了维护这个额外的功能。
我也很好奇为什么我不能用 Google 搜索这个。似乎这个问题出现得如此频繁,以至于人们希望在 rc.local 中使用一个本身不使用所有绝对路径命令调用的命令。此外,我觉得答案应该很简单,因为我可以在启动后立即登录并以 root 身份运行任何我喜欢的命令,而 root 也是 rc.local 运行的用户!难道没有一个钩子可以在“是的,我们现在确实已经完全启动了,让我们以系统上的完全对等用户身份运行这个脚本,没有任何任意限制”的上下文中运行脚本吗?
这不是我第一次遇到这个问题,我很想了解发生了什么。
编辑:
(我不会等 8 个小时来回答我自己的问题,所以……)
好吧,看来设置 PATH 是可行的。我想我的印象是,即使在调用 bash 脚本后,也不会在 PATH 中搜索 rc.local 及其子级中的命令,但这是错误的。(@TiZon 给了我一个很好的线索。)我之所以有这种印象,是因为每个 Google 结果都告诉提问者在命令调用中使用绝对路径,即使对于任何超出简单脚本或依赖于不遵循此规则的第三方命令的脚本来说,这都很麻烦。相反,答案是使用适当的 shebang 行调用 bash 脚本,通过在常规会话期间回显它来找出正常环境的 PATH,然后将启动 bash 脚本中的 PATH 设置为常规 PATH。
希望这个答案能够在 Google 上出现并帮助其他可怜的迷失的灵魂。
答案1
尝试/bin/bash
在命令前面加上。您不能使用相对路径,因为没有环境来跟踪它们。如果您在 bash-shell 中运行所有内容,bash 将为您跟踪这些内容。同样适用于crontab
答案2
请记住,rc.local 在路径 / 中运行,而不是从其所在的路径运行。
因此,如果您从 rc.local 调用脚本,例如,
/home/myscript
并且该脚本本身包含相对路径(即,它是在假设从 /home 运行的情况下编写的),那么从 / 运行时它将失败。
任何您想从 rc.local 运行的脚本都应该通过从 / 运行进行测试:
cd /
./home/myscript
如果它这样运行正常,那么您可以确定绝对/相对路径没有问题