关于开机启动服务,CentOS 6 的命令是 chkconfig,CentOS 7 是 systemctl。

CentOS 6 中的 chkconfig 命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记 chkconfig 不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

CentOS 7 中如果要让任务开机自启动,需将对应的 Unit 文件存放于 /etc/systemd/system 下。即 systemctl 将服务加入开机自启动的操作,实际上是在 /etc/systemd/system 某个 target.wants 目录下创建服务配置文件的软链接文件。而显然的,禁用服务开机自启动的操作是移除软链接。

  1. $ systemctl enable rsyncd.service
  2. Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
  3. $ systemctl disable rsyncd.service
  4. Removed symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service.

Linux OS 将操作环境分为以下7个等级,即:
0:关机
1:单用户模式(单用户、无网络)
2:无网络支持的多用户模式(多用户、无网络)
3:有网络支持的多用户模式(多用户、有网络)
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式(多用户、有网络、X-Window界面)
6:重新引导系统,即重启

查看自启动服务

  1. # CentOS 6
  2. chkconfig --list # 显示开机启动服务列表
  3. # CentOS 7
  4. systemctl list-unit-files --type service | grep enabled

查看某服务的开机启动状态

  1. # CentOS 6
  2. chkconfig --list servicename
  3. # 例如
  4. # chkconfig --list httpd
  5. # 输出:httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  6. # 说明:默认情况下,on 和 off 开关只对运行级 2,3,4,5 有效。
  7. # 说明:上面的输出 0-6 都为 off,表示没有自动启动。
  8. # CentOS 7
  9. systemctl list-unit-files --type service | grep service_name

启动(关闭,重启,查看)某个服务

  1. # CentOS 6
  2. service service_name (start|stop|restart|status)
  3. # CentOS 7
  4. systemctl (start|stop|restart|status) service_name

设置开机启动或者关闭某个服务

  1. # CentOS 6
  2. # 1. 服务脚本必须存放在 /etc/ini.d/ 目录下
  3. cp xxx /etc/ini.d/
  4. # 2. 增加/删除所指定的系统服务,让 chkconfig 指令得以管理它
  5. chkconfig --add/--del service_name
  6. # 3. 开启/关闭服务,不指定任何运行级别的 chkconfig on 将启用运行级别 2、3、4 和 5上 的服务。
  7. chkconfig service_name on/off
  8. # CentOS 7
  9. systemctl enable service_name # 开机启动
  10. systemctl disable service_name # 开机关闭

以下内容节选自《systemd时代的开机自启动任务 | 骏马金龙》,供参考。

systemd 中自定义开机自启动命令/脚本

  • 在 SysV 系统中,要让某个命令或者某个脚本开机自启动,可以将命令或者脚本的命令行写入 /etc/rc.d/rc.local 文件中。

  • 在 systemd 中,要让命令或者某个脚本开机自启动,要么将其编写成一个开机自启动服务,要么通过兼容的 /etc/rc.d/rc.local。

但更建议的方案是编写开机自启动服务,后面会专门介绍服务管理配置文件如何编写。

下面是一个简单的让命令(脚本)开机自启动的配置文件:

  1. $ cat /usr/lib/systemd/system/mycmd.service
  2. [Unit]
  3. Description = some shell script
  4. # 要求脚本具有可执行权限
  5. ConditionFileIsExecutable=/usr/bin/some.sh
  6. # 指定要运行的命令、脚本
  7. [Service]
  8. ExecStart = /usr/bin/some.sh
  9. # 下面这段不能少
  10. [Install]
  11. WantedBy = multi-user.target
  12. $ systemctl daemon-reload
  13. $ systemctl enable mycmd.service

如果要使用 /etc/rc.local 的方式呢?systemd 提供了 rc-local.service 服务来加载 /etc/rc.d/rc.local 文件中的命令。

  1. $ cat /usr/lib/systemd/system/rc-local.service
  2. # This unit gets pulled automatically into multi-user.target by
  3. # systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
  4. [Unit]
  5. Description=/etc/rc.d/rc.local Compatibility
  6. ConditionFileIsExecutable=/etc/rc.d/rc.local
  7. After=network.target
  8. [Service]
  9. Type=forking
  10. ExecStart=/etc/rc.d/rc.local start
  11. TimeoutSec=0
  12. RemainAfterExit=yes

这个文件缺少了 [Install] 段且没有 WantedBy,后面将会解释 Install 中的 WantedBy 表示设置该服务开机自启动时,该服务加入到哪个『运行级别』中启动。

但这个文件的注释中说明了,如果 /etc/rc.d/rc.local 文件存在且具有可执行权限,则 systemd-rc-local-generator 将会自动添加到 multi-user.target 中,所以,即使没有 Install 和 WantedBy 也无关紧要。

另一方面需要注意,和 SysV 系统在系统启动的最后阶段运行 rc.local 不太一样,systemd 兼容的 rc.local 是在 network.target 即网络相关服务启动完成之后就启动的,这意味着 rc.local 可能在开机启动过程中较早的阶段就开始运行。

如果想要将命令加入到 /etc/rc.local 中实现开机自启动,直接写入该文件,并设置该文件可执行权限即可。

例如:

  1. echo -e '#!/bin/bash\ndate +"%F %T" >/tmp/a.log' >>/etc/rc.d/rc.local
  2. chmod +x /etc/rc.d/rc.local