rc.local 中的 bash 代码在启动后不执行

rc.local 中的 bash 代码在启动后不执行

有人知道为什么系统在启动时不会执行 rc.local 中的脚本代码吗?我有一个配置后的 bash 脚本,我想在 VMware ESX(Red Hat)初次安装后运行它,但由于某种原因,它似乎没有执行。我已设置记录其执行的开始和进度,以便在某个时候失败时可以看到它进展到了什么程度,但即使我查看该日志,我也发现它甚至没有开始执行脚本代码。我已经检查过该脚本是否具有执行权限(755),我还应该查看什么?

这是我的代码的前几行:

#!/bin/sh
echo >> /tmp/configLog ""
echo >> /tmp/configLog "Entering maintenance mode"

答案1

那么,/tmp/configLog 存在吗?如果存在,则说明你的脚本正在运行,只是在某个地方停止运行了。

从基础开始:

  1. 在 /etc/rc.local 中放置一个简单的单行代码,如下所示。
    触摸/tmp/itworked
    这样做有效吗?重启后,/tmp/itworked 是否存在?如果存在,则 rc.local 正在执行。
  2. 另一个常见的问题是,如果您的脚本是守护进程,它要么需要处理分叉到后台,要么需要在 rc.local 中后台运行。如果您的脚本是 /bin/myscript,那么 rc.local 应该具有:
    /bin/myscript &
    在其中。运行需要很长时间吗? init 脚本中的某处可能存在超时,以防止用户停止启动过程 - 如果存在超时,则后台运行该过程将帮助您解决这个问题。
  3. 如果“触摸”有效,并且您正在后台运行,那么它必须位于您的脚本中的某个位置。当您运行
    /bin/sh /etc/rc.local
    从命令行?
  4. 就像 Jason 所说的那样,检查 dmesg 以及 /var/log/messages 寻找任何线索。
  5. 当脚本从 rc.local 运行时,它将不具有 root 用户登录时所具有的完整环境变量集 - 例如 $PATH 可能不同。不要依赖 $PATH。您还可以通过安排接近模拟环境的“at”作业来测试脚本。

答案2

这不是像打字错误这样简单的事情吧?应该是这样的:

#!/bin/hash

确实是:

#!/bin/bash

(就像 CK 在评论中说的,现在我看了)

答案3

您确定您的系统支持 rc.local 吗?如果没有记录,您将需要遵循所有 init 脚本。您从 /etc/inittab 开始。(您可能会发现从那里转到 /etc/rc.d/rc)

在某些系统上,/etc/rc.d/rc.local 通过符号链接 /etc/rc.d/rcX.d/S99local 得到支持(其中 X 是适当的运行级别)。

如果您使用的是 RedHat,那么没有理由不创建自己的 init 脚本,将其添加到 /etc/rc.d/init.d,chkconfig --add 脚本,然后 chkconfig 脚本。这将使正确的符号链接进入 /etc/rc.d/rcX.d 目录,并使 init 脚本易于部署或禁用。

如果您的系统支持,使用过时的 rc.local 进行快速破解是很好的,但对于某些重要或永久的事情来说,它并不合适。

答案4

rc.local 脚本可能存在语法错误。如果您在系统启动后尝试从命令行手动运行该脚本,它是否可以正确执行?

相关内容