CentOS 7设置服务开机自启,systemctl enable与chkconfig区别
装完Nginx、MySQL、Redis,重启机器后发现服务没跟着起来,这种尴尬谁遇谁抓狂。CentOS 7改了启动框架,老习惯直接敲chkconfig已经不管用,新命令systemctl enable看着眼熟,却总记不清加不加.service后缀。下面把踩过的坑一次说清,照着做,下次开机服务秒起,再也不用蹲机房敲start。

一、CentOS 7启动机制变了啥
6时代用SysV,脚本丢/etc/init.d,靠chkconfig写几个数字链接到rc.d。7换成systemd,单元文件放在/usr/lib/systemd/system或/etc/systemd/system,启动并行度更高,依赖关系用配置文件就能声明,不用再写那堆case语句。理解这一点,后面命令差异自然通透。
二、systemctl enable到底干了什么
敲下systemctl enable nginx.service,系统会在/etc/systemd/system/multi-user.target.wants/里建一条软链,指向真正的单元文件。开机时systemd按target顺序扫描wants目录,找到链接就拉起服务。想取消,systemctl disable nginx.service,链接被删,干净利落。记住enable只建链接,不立即启动;如果想当场生效,再加一条systemctl start。
三、chkconfig还能用吗
系统自带兼容脚本,敲chkconfig nginx on会提示redirecting to systemctl enable,实际走的还是systemd那一套。老脚本如果只有/etc/init.d文件,没有单元文件,chkconfig会回退到旧模式,创建rc.d链接,但并行优势享受不到,官方明确建议写原生单元文件,别抱着老工具不放。

四、两条命令细节对照表
enable/disable:systemctl专供,支持–now参数一次性启动;chkconfig只是壳,不支持–now。
查看启动项:systemctl list-unit-files | grep enabled 一目了然;chkconfig –list输出混杂,还得人工筛。
级别概念:systemd用target,graphical、multi-user、rescue随切随换;SysV的2345级别已成历史,别再背那些数字。
依赖管理:单元文件里写After=network.target,确保网卡就绪再启动;老脚本得自己sleep,土法炼钢容易翻车。
五、实战:让自定义脚本开机自启

假设写了个/opt/mon.sh监控程序,想让它跟着机器起来。
写单元文件/etc/systemd/system/mon.service:
[Unit]
Description=My Monitor
After=network.target
[Service]
ExecStart=/opt/mon.sh
Restart=always
[Install]
WantedBy=multi-user.target
重载配置:systemctl daemon-reload
设开机自启:systemctl enable –now mon.service
一条命令搞定enable+start,再也不用重启机器验证。
六、常见翻车点速查
文件放错位置:单元丢在/etc/init.d,enable会报找不到。
没重载就enable:daemon-reload忘记敲,systemd读的还是旧缓存。
路径写相对:ExecStart=mon.sh,系统找不到,绝对路径最稳。
权限没给足:脚本没+x,启动直接fail,journalctl -xe看日志秒定位。
七、老项目迁移最小改动法
实在不想写单元文件,可临时用/etc/rc.d/rc.local,给该文件加执行权限,把启动命令写进去。不过rc.local已被systemd兼容成服务,属于最后兜底方案,新项目别这么干。
CentOS 7下,systemctl enable是正道,chkconfig只是壳;写对单元文件、放对目录、重载配置、一次enable,服务就能稳稳当当每次开机自启。
