有人知道为什么系统在启动时不会执行 rc.local 中的脚本代码吗?我有一个配置后的 bash 脚本,我想在 VMware ESX(Red Hat)初次安装后运行它,但由于某种原因,它似乎没有执行。我已设置记录其执行的开始和进度,以便在某个时候失败时可以看到它进展到了什么程度,但即使我查看该日志,我也发现它甚至没有开始执行脚本代码。我已经检查过该脚本是否具有执行权限(755),我还应该查看什么?
这是我的代码的前几行:
#!/bin/sh
echo >> /tmp/configLog ""
echo >> /tmp/configLog "Entering maintenance mode"
答案1
那么,/tmp/configLog 存在吗?如果存在,则说明你的脚本正在运行,只是在某个地方停止运行了。
从基础开始:
- 在 /etc/rc.local 中放置一个简单的单行代码,如下所示。
触摸/tmp/itworked
这样做有效吗?重启后,/tmp/itworked 是否存在?如果存在,则 rc.local 正在执行。 - 另一个常见的问题是,如果您的脚本是守护进程,它要么需要处理分叉到后台,要么需要在 rc.local 中后台运行。如果您的脚本是 /bin/myscript,那么 rc.local 应该具有:
/bin/myscript &
在其中。运行需要很长时间吗? init 脚本中的某处可能存在超时,以防止用户停止启动过程 - 如果存在超时,则后台运行该过程将帮助您解决这个问题。 - 如果“触摸”有效,并且您正在后台运行,那么它必须位于您的脚本中的某个位置。当您运行
/bin/sh /etc/rc.local
从命令行? - 就像 Jason 所说的那样,检查 dmesg 以及 /var/log/messages 寻找任何线索。
- 当脚本从 rc.local 运行时,它将不具有 root 用户登录时所具有的完整环境变量集 - 例如 $PATH 可能不同。不要依赖 $PATH。您还可以通过安排接近模拟环境的“at”作业来测试脚本。
答案2
这不是像打字错误这样简单的事情吧?应该是这样的:
#!/bin/
h
ash
确实是:
#!/bin/
b
ash
?
(就像 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 脚本可能存在语法错误。如果您在系统启动后尝试从命令行手动运行该脚本,它是否可以正确执行?