关于开机启动服务,CentOS 6 的命令是 chkconfig,CentOS 7 是 systemctl。
CentOS 6 中的 chkconfig 命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记 chkconfig 不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。
CentOS 7 中如果要让任务开机自启动,需将对应的 Unit 文件存放于 /etc/systemd/system 下。即 systemctl 将服务加入开机自启动的操作,实际上是在 /etc/systemd/system 某个 target.wants 目录下创建服务配置文件的软链接文件。而显然的,禁用服务开机自启动的操作是移除软链接。
$ systemctl enable rsyncd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
$ systemctl disable rsyncd.service
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:重新引导系统,即重启
查看自启动服务
# CentOS 6
chkconfig --list # 显示开机启动服务列表
# CentOS 7
systemctl list-unit-files --type service | grep enabled
查看某服务的开机启动状态
# CentOS 6
chkconfig --list servicename
# 例如
# chkconfig --list httpd
# 输出:httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# 说明:默认情况下,on 和 off 开关只对运行级 2,3,4,5 有效。
# 说明:上面的输出 0-6 都为 off,表示没有自动启动。
# CentOS 7
systemctl list-unit-files --type service | grep service_name
启动(关闭,重启,查看)某个服务
# CentOS 6
service service_name (start|stop|restart|status)
# CentOS 7
systemctl (start|stop|restart|status) service_name
设置开机启动或者关闭某个服务
# CentOS 6
# 1. 服务脚本必须存放在 /etc/ini.d/ 目录下
cp xxx /etc/ini.d/
# 2. 增加/删除所指定的系统服务,让 chkconfig 指令得以管理它
chkconfig --add/--del service_name
# 3. 开启/关闭服务,不指定任何运行级别的 chkconfig on 将启用运行级别 2、3、4 和 5上 的服务。
chkconfig service_name on/off
# CentOS 7
systemctl enable service_name # 开机启动
systemctl disable service_name # 开机关闭
以下内容节选自《systemd时代的开机自启动任务 | 骏马金龙》,供参考。
systemd 中自定义开机自启动命令/脚本
在 SysV 系统中,要让某个命令或者某个脚本开机自启动,可以将命令或者脚本的命令行写入 /etc/rc.d/rc.local 文件中。
在 systemd 中,要让命令或者某个脚本开机自启动,要么将其编写成一个开机自启动服务,要么通过兼容的 /etc/rc.d/rc.local。
但更建议的方案是编写开机自启动服务,后面会专门介绍服务管理配置文件如何编写。
下面是一个简单的让命令(脚本)开机自启动的配置文件:
$ cat /usr/lib/systemd/system/mycmd.service
[Unit]
Description = some shell script
# 要求脚本具有可执行权限
ConditionFileIsExecutable=/usr/bin/some.sh
# 指定要运行的命令、脚本
[Service]
ExecStart = /usr/bin/some.sh
# 下面这段不能少
[Install]
WantedBy = multi-user.target
$ systemctl daemon-reload
$ systemctl enable mycmd.service
如果要使用 /etc/rc.local 的方式呢?systemd 提供了 rc-local.service 服务来加载 /etc/rc.d/rc.local 文件中的命令。
$ cat /usr/lib/systemd/system/rc-local.service
# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.d/rc.local is executable.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
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 中实现开机自启动,直接写入该文件,并设置该文件可执行权限即可。
例如:
echo -e '#!/bin/bash\ndate +"%F %T" >/tmp/a.log' >>/etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local