(转)Linux下/etc/rc.local与/etc/init.d的区别与联系

Linux下/etc/rc.local与/etc/init.d的区别与联系  

2012-10-13 20:14:52|  分类: Linux学习|字号 订阅

 
 
1./etc/rc.local 
这是使用者自定义开机启动程序,把需要开机自动运行的程序写在这个脚本里再完成 run level 3 的服务启动后,
如果我还有其他的动作想要完成时,举例来说, 我还想要寄一封 mail 给某个系统管理帐号,通知他,系统刚刚
重新开机完毕,那么, 是否应该要制作一个 shell script 放置在 /etc/rc.d/init.d/ 里面,然后再以连结方式
连结到 /etc/rc.d/rc3.d/ 里面呢?呵呵!当然不需要!还记得上一小节提到的 /etc/rc.d/rc.local 吧?
这个档案就可以执行您自己想要执行的系统指令了。像不像早期 DOS 年代的 autoexec.bat 与 config.sys 呢?
也就是说,我有任何想要在开机时就进行的工作时,直接将他写入 /etc/rc.local , 那么该工作就会在开机的
时候自动被载入喔!而不必等我们登入系统去启动呢!是否很方便啊!一般来说,鸟哥就很喜欢把自己制作的
shell script 完整档名写入 /etc/rc.d/rc.local ,如此一来,开机就会将我的 shell script 执行过,真是好棒
那!也就是说,在linux启动的最后阶段,系统会执行存于rc.local中的命令。和windows里面的“启动”菜单有点
像,但是设置麻烦些,功能更强大。

使用情况:

1)oracle等服务器的启动:如果你需要你的oracle可以随着系统一起启动,你可以去看看/etc/oratab这个文件,然后去了解它,你就会发现这里才是它正确的位置所在

2)静态路由: 对于需要增加大量的不是本网段的路由时,很多人喜欢在/etc/rc.d/rc.local里添加类似

route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.224.0.251

route add -host 192.168.100.1  gw 10.224.0.251

 

2. /etc/init.d  
       这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本。系 统在安装时装了好多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。举个例子来说,如果你要重新启动 sendmail 的话,而且你的 sendmail 是以 rpm 来安装的,那么下达 /etc/rc.d/init.d/sendmail restart 就可以直接启动 sendmail 啰!
        前面说到,/etc/rc.d/init.d这个目录下的脚本就类似与windows中的注册表,在系统启动的时候执行。程序运行到这里(init进程读取了运行级别), 是该运行init.d里的脚本了,但是并不是直接运行,而是有选择的因为系统并不需要启动所有的服务。
  那么,系统是如何选择哪些需要启动哪些不要呢?这时刚才说的运行级别就起作用了。在决定了系统启动的run level之后,/etc/rc.d/rc这个脚本先执行。在RH9和FC7的源码中它都是一上来就check_runlevel()(虽然实现的代码不一样,也大同小异),知道了运行级别之后,对于每一个运行级别,在rc.d下都有一个子目录分别是rc0.d,rc1.d ….. rc6.d。每个目录下都是到init.d目录的一部分脚本一些链接。每个级别要执行哪些服务就在相对应的目录下,比如级别5要启动的服务就都放在rc5.d下,但是放在这个rc5.d下的都是一些链接文件,链接到init.d中相对应的文件,真正干活到init.d里的脚本。

转载于:https://www.cnblogs.com/lihaiping/p/rclocal.html

<think>好的,我现在需要解释用户提供的这两个命令:`chmod +x /etc/rc.d/rc.local` `echo "/etc/init.d/sshd.init start" >> /etc/rc.d/rc.local`。首先,我得确保自己完全理解每个命令的作用,以及它们通常用在什么场景下。 首先看第一个命令:`chmod +x /etc/rc.d/rc.local`。`chmod`是用来修改文件权限的命令,`+x`表示添加可执行权限。所以这个命令的作用是让`/etc/rc.d/rc.local`文件变成可执行的。通常,在Linux系统中,某些文件默认可能没有执行权限,需要手动添加,特别是像启动脚本这样的文件。如果用户希望这个脚本在启动时自动运行,那么它必须具备可执行权限,否则系统无法执行它。 接下来是第二个命令:`echo "/etc/init.d/sshd.init start" >> /etc/rc.d/rc.local`。这里使用了`echo`命令将字符串`/etc/init.d/sshd.init start`追加到`/etc/rc.d/rc.local`文件中。`>>`是重定向符号,表示追加内容到文件末尾,而不是覆盖。这条命令的目的是将启动SSH服务的命令添加到`rc.local`脚本中,这样每次系统启动时,就会自动执行这个命令,启动SSH守护进程。 不过,现在需要考虑这些命令是否适用于现代的Linux发行版。因为我知道,很多系统已经向使用systemd,而不是传统的SysVinit。例如,在基于systemd的系统中,`rc.local`可能默认不存在,或者需要额外启用。例如,用户可能需要先启用`rc-local.service`,并确保`/etc/rc.d/rc.local`有正确的权限内容。如果用户是在一个仍然使用SysVinit或Upstart的系统上,比如较旧版本的CentOS或Debian,那么这些命令可能仍然有效。 另外,关于第二个命令中的路径`/etc/init.d/sshd.init`,这让我有点疑问。通常,SSH服务的启动脚本是`/etc/init.d/ssh`或者`/etc/init.d/sshd`,具体取决于发行版。例如,在Debian/Ubuntu中通常是`/etc/init.d/ssh`,而在CentOS/RHEL中是`/etc/init.d/sshd`。用户提到的`sshd.init`可能是一个非标准的脚本名称,或者可能是在某些特定发行版中的命名。这可能导致命令执行失败,如果路径不正确的话。需要确认该路径是否存在,否则用户可能需要调整路径。 此外,使用`rc.local`来管理启动项虽然传统,但在现代系统中可能不是最佳实践。使用systemd的话,用户应该创建一个服务单元文件,或者使用`systemctl enable`来启用服务。例如,对于SSH服务,通常已经存在对应的服务单元,用户只需执行`systemctl enable sshd`即可让SSH在启动时自动运行。如果用户坚持使用`rc.local`,可能需要检查systemd是否兼容,或者需要做其他配置。 还有一个需要注意的地方是权限问题。修改系统文件如`rc.local`需要超级用户权限,所以用户在执行这两个命令时应该使用`sudo`或者以root身份运行,否则可能会遇到权限拒绝的错误。例如,正确的命令应该是: ```bash sudo chmod +x /etc/rc.d/rc.local sudo echo "/etc/init.d/sshd.init start" >> /etc/rc.d/rc.local ``` 不过,当使用`sudo`配合`>>`重定向时,可能会遇到权限问题,因为重定向是由shell处理的,而不是`sudo`。所以更可靠的方式是用`tee`命令: ```bash echo "/etc/init.d/sshd.init start" | sudo tee -a /etc/rc.d/rc.local ``` 这样可以确保以root权限追加内容到文件。 另外,用户需要确认`/etc/rc.d/rc.local`是否存在。在某些系统中,这个文件可能位于`/etc/rc.local`,而`/etc/rc.d/rc.local`是一个符号链接。如果文件不存在,可能需要手动创建,并确保其可执行。 总结一下,用户的目的是在系统启动时自动启动SSH服务。但根据不同的系统环境,可能有不同的最佳实践。如果系统使用systemd,更推荐的方式是使用`systemctl enable sshd`。如果确实需要使用`rc.local`,则需要确保该机制在系统中是启用的,并且文件路径启动命令正确无误。 可能的错误点包括: 1. `rc.local`文件不存在或未启用。 2. SSH启动脚本的路径不正确。 3. 权限不足,未使用sudo。 4. 在systemd系统中未处理依赖关系,导致`rc.local`未执行。 因此,在解释这两个命令时,需要指出它们的用途,同时提醒用户注意系统兼容性更现代的替代方法。此外,验证步骤也很重要,比如检查`rc.local`是否执行,SSH服务是否确实在启动后运行。</think>这两个命令用于在 Linux 系统启动时自动启动 SSH 服务,但需注意**系统兼容性****现代替代方案**。以下是分步解释: --- ### 1. `chmod +x /etc/rc.d/rc.local` - **作用**:为 `/etc/rc.d/rc.local` 文件添加可执行权限。 - **背景**:`rc.local` 是传统 Linux 系统(如 SysVinit)的启动脚本,系统启动时会自动执行此文件。若文件无可执行权限,脚本将无法运行。 --- ### 2. `echo "/etc/init.d/sshd.init start" >> /etc/rc.d/rc.local` - **作用**:将启动 SSH 服务的命令追加到 `rc.local` 文件中。 - **背景**:通过追加命令 `/etc/init.d/sshd.init start`,系统每次启动时会自动执行此命令以启动 SSH 服务。 --- ### 注意事项 1. **系统兼容性**: - **现代系统(如 systemd)**:许多新发行版(Ubuntu 16.04+、CentOS 7+)默认使用 `systemd`,不再依赖 `rc.local`。若需使用: - 确保 `rc-local.service` 已启用: ```bash sudo systemctl enable rc-local.service ``` - 文件路径可能是 `/etc/rc.local`(而非 `/etc/rc.d/rc.local`)。 - **传统系统(SysVinit)**:适用于 CentOS 6、Debian 7 等旧版本。 2. **SSH 脚本路径问题**: - 常见路径为 `/etc/init.d/ssh`(Debian/Ubuntu)或 `/etc/init.d/sshd`(CentOS/RHEL)。 - 执行前需确认 `/etc/init.d/sshd.init` 是否存在,否则命令会失败。 3. **更推荐的现代方法**: - 使用 `systemd` 管理服务: ```bash sudo systemctl enable sshd # 启用开机自启 sudo systemctl start sshd # 立即启动 ``` - 此方法更标准化且易于维护。 4. **权限问题**: - 若未用 `sudo`,可能导致权限错误。建议完整命令为: ```bash sudo chmod +x /etc/rc.d/rc.local echo "/etc/init.d/sshd.init start" | sudo tee -a /etc/rc.d/rc.local ``` --- ### 验证是否生效 1. 重启系统后检查 SSH 服务状态: ```bash systemctl status sshd # systemd 系统 service sshd status # SysVinit 系统 ``` 2. 检查 `rc.local` 是否被执行: ```bash sudo grep "sshd.init" /var/log/boot.log # 查看启动日志 ``` --- ### 总结 - **适用场景**:传统 SysVinit 系统,且需确保路径权限正确。 - **推荐更新方案**:优先使用 `systemctl enable sshd`(现代系统)。 - **风险提示**:直接修改 `rc.local` 可能在新系统中失效,建议确认系统初始化机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值