根本无法让 rc.local 自动运行

根本无法让 rc.local 自动运行

所以我一直在尝试让/etc/rc.local脚本运行,但对我来说,似乎什么都不起作用。我可以使用 手动运行它service rc.local start,它只会向我的主目录中的文件回显“hi”,但重新启动时它不会运行。似乎设置了所有正确的权限,并且链接存在于正确的 rc#.d 目录中。作为参考,以下是相关信息:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local


# ls -l /etc/init.d/rc.local                                  
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local


# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root  18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local


# cat /etc/rc.local
#! /bin/bash

echo hi > ~user/test

exit 0

我尝试删除/etc/rc.local/etc/init.d/rc.local运行update-rc.d rc.local remove,然后恢复它们并update-rc.d rc.local defaults像这个问题一样运行:rc.local不执行。那没有用。

重新启动或进入任何初始化级别后它也不起作用。当 shebang 行读取#! /bin/sh -e或 时,它不起作用#! /bin/bash。不过,如果我手动运行它,我可以让/etc/rc.local/etc/init.d/rc.local脚本回显到不同的文件。

所以我的问题是......我做错了什么以及如何让 rc.local 运行?另外,虽然我不介意听到替代方案(例如暴发户),但我只会接受向我展示(或帮助我找到)如何让 rc.local 正常运行(并且最好告诉我出了什么问题)的答案。

以下是一些有关其价值的附加信息:

# dmesg | grep "Linux version"
[    0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)


# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012

# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 14 Nadia
Release:        14
Codename:       nadia

答案1

问题在于这一行:

echo hi > ~user/test

~user并没有像你预期的那样扩展。rc.local正在运行,但由于意外的扩展,它试图写入可能没有权限的某个地方。

请尝试以下方法:

echo ~user/test > /dev/shm/test

然后检查 的内容/dev/shm/test。这将显示它rc.local确实运行,以及它正在扩展~user到什么。

尽管如此,我的建议是使用显式路径,而不是依赖外部环境。

答案2

“我不介意听到替代品(比如暴发户)”意味着你不明白一些事情。我不是薄荷用户,但显然它是一个基于新贵的系统。 Upstart 是一个 init 守护进程,您的系统只安装了一个。所以暴发户不是一个替代方案;别无选择——你的系统使用了upstart。时期。它不使用任何其他东西。然而,upstart 包含与 sysvinit 脚本的向后兼容性,这意味着您可以通过在 /etc/rc 目录中放置链接来管理服务,并使用一些旧命令,例如serviceupdate-rc.d

由于您自己承认不太了解 sysvinit 系统的工作原理,因此我认为您学习它是浪费时间。您不妨了解一下真正的 init 守护进程是如何工作的。 Upstart 非常简单;请记住,95% 对它的抱怨(以及对 Fedora 派生系统上的 systemd 的类似抱怨)只是那些对 sysvinit 有简单掌握的人,并且因为他们可能需要花几个小时学习一些东西而感到愤怒新的。

因此,我想说要检查 rc 目录等,以获取 sysvinit 样式链接,但是从您链接到的解决方案失败的“Rc.local 不执行”问题来看,我认为您在浪费时间此时。忘记 sysvinit 兼容性以及 /etc/rc 和 init.d 目录。

Upstart 处理.conf文件/etc/init(注意:不是 init.d)。因此,如果您想在启动时运行某些脚本,只需将 .conf 文件添加到 /etc/init 即可。它不必是可执行的,但应该由 root 拥有。

author "You"

start on started local-filesystems

script
    /etc/rc.local # but don't really be this lazy, see below
end script

为了防止将来的混淆和进一步的 sysvinit 恶作剧,我建议您将 /etc/rc.local 脚本的名称更改为其他名称,或者更好的是,只需将其中的所有内容移至 .conf 文件(scriptend script标记之间的所有内容都会被处理)由外壳)。

新贵的权威参考可能是新贵食谱。就像我说的,这是 sysvinit 在用户友好性方面的一项改进,但不幸的是,网上仍然缺乏关于它的像样的材料,并且有很多混乱和不完整的东西。但在启动时运行脚本就像刚才描述的那样简单。

如果 .conf 文件名为“my-localboot.conf”,您可以使用以下命令测试您的服务

initctl start my-localboot

相关内容