【问题标题】:Bash script stops after including /etc/init.d/functionsBash 脚本在包含 /etc/init.d/functions 后停止
【发布时间】:2018-03-17 06:32:49
【问题描述】:

我正在 CentOS 7 上创建我的第一个初始化脚本。我想在这个脚本上运行一个进程作为守护进程,并尝试使用 /etc/init.d/functions 文件中的守护进程函数,但是当我包含这个脚本时执行停止。

假设我创建的文件是“/etc/init.d/UpdateScript” 如果我写:

echo "Script start"
. /etc/init.d/functions
echo "After add functions"

所以在命令之后: /etc/init.d/UpdateScript 启动

我只有“脚本启动”作为输出。但是,如果我评论“# . /etc/init.d/functions”,我也有“添加函数后”,但当然是“守护进程:找不到命令”。 这种奇怪行为的原因是什么?如何解决?

【问题讨论】:

  • 尝试set -x 看看/etc/init.d/functions 退出的位置。
  • /etc/init.d 在 CentOS 7 中被弃用,并切换到 systemd。尝试采购/lib/lsb/init-functions 以获得更便携的替代方案。如果您还没有 redhat-lsb-core 软件包,则需要安装它。更好的是,编写 systemd .service 文件而不是 init.d 样式的启动脚本。
  • 您在脚本中使用set -e 吗?
  • "您在脚本中使用 set -e 吗?"不,我没有。

标签: linux bash centos7 init


【解决方案1】:

/etc/init.d/functionsreturn 0 结尾。当您 source(或 .)一个 shell 脚本时,您实际上是用它的内容替换了 source 调用。由于那里有一个 return,执行不会在它之后继续,echo "After add functions" 永远不会执行。

【讨论】:

  • 在哪个版本的 CentOS 7 上以return 0 结尾?它不在我的 7.2 系统上。 (怎么可能呢?return 只能在函数内部工作。)
  • 在我的 Fedora 26 上注意到了它。我猜它在 CentOS/RHEL 系统上很相似,但我手头没有可以检查的。
  • 是的,它确实以“return 0”结尾,可能是因为 init.d 被弃用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2011-04-01
  • 2013-09-29
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
相关资源
最近更新 更多