有谁知道为什么系统不会在启动时执行 rc.local 中的脚本代码?我有一个配置后的 bash 脚本,我想在初始安装 VMware ESX(Red Hat)后运行它,但由于某种原因,它似乎没有执行。我有设置来记录它的执行开始,甚至它的进度,这样我就可以看到它在某个时候失败的情况下能走多远,但即使我查看那个日志,我发现它甚至没有开始脚本代码的执行。我已经检查了该脚本是否具有执行权限(755),我还应该查看什么?
这是我的代码的前几行:
#!/bin/sh
echo >> /tmp/configLog ""
echo >> /tmp/configLog "Entering maintenance mode"
那么,/tmp/configLog 存在吗?如果是这样,你的脚本正在触发,它只是在某个地方死去。
从基础开始:
这不是像错字这样简单的事情吗?应该这样:
真的是:
?
(就像CK在评论中说的,现在我看)
你确定你的系统支持 rc.local 吗?如果没有记录,您将需要遵循所有的初始化脚本。您从 /etc/inittab 开始。(您可能会发现从那里转到 /etc/rc.d/rc)
在某些系统上,通过符号链接 /etc/rc.d/rcX.d/S99local 支持 /etc/rc.d/rc.local。(其中 X 是适当的运行级别)。
如果您使用的是 RedHat,则没有真正的理由不创建自己的初始化脚本,将其添加到 /etc/rc.d/init.d,chkconfig --add 脚本,并在脚本上添加 chkconfig。这将使正确的符号链接进入 /etc/rc.d/rcX.d 目录,并使初始化脚本易于部署或禁用。
如果您的系统确实支持它,使用过时的 rc.local 可以快速破解它,但它并不适合重要或永久的东西。
不确定 linux 上的 init 脚本处理是顺序的还是并行的,但 Solaris 系统会按顺序启动脚本。如果早期的初始化脚本还没有完成(我有时会因为 sendmail/DNS 依赖而看到这一点),那么后面的初始化脚本不会像你想象的那样快速启动。
使用 ps 查看早期的初始化脚本是否仍在运行。
rc.local 脚本中可能存在语法错误。如果您在系统启动后尝试从命令行手动运行它,它是否正确执行?
您是否检查过包含 rc.local 文件的目录的权限?
你的代码不应该看起来更像这样吗?这里有 3 处变化:
rc.local 是运行启动脚本的 BSD 方式。尽管许多 Linux 版本确实支持在启动时运行一个名为“rc.local”的文件,但我记得这些需要一堆符号链接和其他粘合剂才能工作,因为 Linux 遵循 Solaris 处理启动脚本的方式。
SELinux。
尝试 getenforce 以查看 selinux 是否已打开。如果打开,它将返回 1 或强制执行。然后,如果检查 dmesg 以查看是否存在与 selinux 相关的错误,看起来可能与您的脚本有关。
如果第一行真的说 #!/bin/hash 那么你会得到一个类似这样的错误:
当它运行时。
您可能还想检查脚本是否具有执行权限。