Linux服务开机自启需先确认初始化系统:ps -p 1 -o comm= 输出 systemd 则用 systemctl enable;输出 init 则用 chkconfig 或 rc.d 脚本;亦可借助 /etc/rc.local 或 crontab @reboot 实现轻量自启。

Linux 中管理服务自启动,关键看系统用的是哪种初始化系统:老系统(如 CentOS 6、Ubuntu 14.04)用 SysVinit,靠 chkconfig 或手动改运行级别脚本;新系统(CentOS 7+、Ubuntu 16.04+、Debian 8+)统一用 systemd,核心命令是 systemctl enable。选错方法会无效,所以第一步得先确认系统类型。
确认你用的是 systemd 还是 SysVinit
执行以下命令:
ps -p 1 -o comm=
如果输出是 systemd,就走 systemd 路线;如果是 init,大概率是 SysVinit 环境。
再顺手查下当前运行级别或目标:
- 对 systemd 系统:运行
systemctl get-default(比如返回multi-user.target) - 对 SysVinit 系统:运行
runlevel(比如返回N 3)
systemd 系统:标准做法是 systemctl enable
这是现代 Linux 的官方推荐方式,适用于 Nginx、MySQL、Docker、自定义服务等。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 启用开机自启:
sudo systemctl enable 服务名(例如sudo systemctl enable nginx) - 禁用开机自启:
sudo systemctl disable 服务名 - 立即启动 + 开机自启一步到位:
sudo systemctl enable --now 服务名 - 检查是否已设为自启:
systemctl is-enabled 服务名(返回enabled表示成功)
注意:服务必须已有有效的 .service 文件,通常放在 /usr/lib/systemd/system/ 或 /etc/systemd/system/ 下。自己写的脚本需先创建服务单元文件再启用。
SysVinit 系统:用 chkconfig 或手动管理 rc 目录
适用于仍在维护的老服务器环境。核心逻辑是“服务在哪些运行级别下开机启动”。
- 查看服务当前在各运行级别的状态:
chkconfig --list 服务名 - 添加服务到 chkconfig 管理(首次注册):
sudo chkconfig --add 服务名 - 开启某服务在运行级别 3 和 5 自启:
sudo chkconfig 服务名 on(默认影响 3/5) - 只在级别 3 启用,级别 5 禁用:
sudo chkconfig --level 3 服务名 on && sudo chkconfig --level 5 服务名 off
底层实际是在 /etc/rc.d/rc3.d/ 等目录下生成 Sxx服务名 符号链接,指向 /etc/init.d/ 中的脚本。
通用补充方案:不依赖服务管理器的轻量级自启
适合简单脚本、临时任务或权限受限场景,不推荐用于生产服务,但很实用:
-
/etc/rc.local:编辑该文件,在
exit 0前添加绝对路径命令,例如:/usr/bin/python3 /opt/myscript.py > /var/log/myscript.log 2>&1 &
CentOS 7+ 需先加执行权限:sudo chmod +x /etc/rc.d/rc.local,并确保rc-local.service已启用。 -
crontab @reboot:仅对当前用户生效,适合普通用户自启个人程序:
crontab -e,新增一行:@reboot /usr/bin/nohup /home/user/app.sh > /home/user/app.log 2>&1 &
注意:网络、数据库等依赖项可能尚未就绪,建议加sleep 10。










