Linux 系统服务开机自启动指导手册
一、引言
在 Linux 系统中,设置服务开机自启动是常见的系统配置任务。本文档详细介绍了多种实现服务开机自启动的方法,包括 systemctl 方式、通用脚本方式、crontab 方案等,并提供了生产环境下的方案建议和开机启动脚本示例。
二、systemctl 方式
2.1 适用范围
适用于已安装为系统服务且服务文件(.service)存储在/usr/lib/systemd/system的组件。
2.2 设置开机启动
使用systemctl enable xxx指令设置开机启动,其中xxx为服务名。例如,设置mysqld服务开机启动:
systemctl enable mysqld
会在/etc/systemd/system/xxx/(系统服务)或/etc/systemd/user/(用户服务)下创建.service 文件的软连接。如mysqld服务,会创建从/etc/systemd/system/multi - user.target.wants/mysqld.service到/usr/lib/systemd/system/mysqld.service的软连接。
2.3 取消开机启动
执行systemctl disable xxx,或者手动移除/etc/systemd/system/xxx/或/etc/systemd/user/下相应软连接或服务文件。
2.4 查看开机启动状态
使用systemctl status xxx查看服务当前状态及是否开机启动。例如,查看mysql服务:
systemctl status mysqld
2.5 分类查看服务
查看系统中已经enable的服务:
systemctl list-unit-files --state=enabled
systemctl list-enabled
查看系统中已经disable的服务:
systemctl list-unit-files --state=disabled
systemctl list-enabled
三、chkconfig 方式
3.1 适用条件
服务脚本文件必须在/etc/init.d/目录下,且结合/etc/rc.d/rc0.d~rc6.d目录实现,同时服务脚本文件必须包含必要的头部脚本代码。
3.2 设置开机启动
使用
chkconfig --add mysql
chkconfig --level 3 mysql on/off
其中mysqld为服务名,–level 3表示在运行级别 3 下设置开机启动或关闭。
3.3 查看开机启动状态
使用
chkconfig --list mysql
四、通用脚本方式
4.1 适用范围
不管组件是否已安装为系统服务均适用。
4.2 方法一:追加启动命令到默认启动脚本
将启动命令追加到/etc/rc.local(或/etc/rc.d/rc.local,前者是后者的软连接)。需要先赋予/etc/rc.d/rc.local可执行权限。
chmod +x /etc/rc.d/rc.local
echo "/usr/local/your_service_start_command" >> /etc/rc.d/rc.local
4.3 方法二:编写启动脚本并放置在特定目录
编写启动脚本.sh,放置到/etc/profile.d目录下。脚本需设置可执行权限,如:
chmod +x /etc/profile.d/your_service_start.sh
4.4 方法三:编写启动脚本并追加执行指令到默认启动脚本
编写启动脚本.sh,设置可执行权限后,将脚本的执行指令追加到/etc/rc.local或/etc/rc.d/rc.local。例如:
chmod +x /usr/local/your_service_start.sh
echo "/usr/local/your_service_start.sh" >> /etc/rc.d/rc.local
五、crontab 方案
5.1 适用范围
适用于需要灵活调度任务的场景,可实现开机启动以及按特定时间间隔执行任务。
5.2 设置开机启动
使用@reboot关键字实现开机启动功能。例如,开机时执行/usr/local/daemonProcess/somescript.sh脚本:
crontab -e
#### 在打开的文件中添加以下内容
@reboot /usr/local/daemonProcess/somescript.sh
5.3 特殊关键字及执行时间
@reboot:重启时执行一次,实测比/etc/rc.d/rc.local更早执行(提前 1 - 2s),比默认 1 分钟定时提前 30s 左右。
@yearly:一年执行一次,1 月 1 号 0 点 0 分执行,等同于@annually。
@monthly:一月执行一次,每月 1 号 0 点 0 分执行。
@weekly:一周执行一次,即"0 0 * * 0"。
@daily:一天执行一次,即"0 0 * * *"。
@hourly:一小时执行一次,即"0 * * * "。
5.4 特别注意
是否同时使用@reboot和定时任务,需根据实际业务需要决定。若守护定时设置为 1 分钟(即 * * * *),建议不再设置@reboot,以免开机启动后的 1 分钟内重复执行;若守护定时间隔较大,建议同时使用@reboot,确保应用服务及时启动。
六、生产环境开机启动方案建议
在生产环境中,建议只采用一种开机启动方案,确保所有组件、服务统一,便于服务较多时的快速运维。比如,有些服务默认安装时不会自动生成系统服务,所以 systemctl 方式不能适用生产环境中所有组件、服务。如果此时按照各组件、服务分别制定开机启动方案,则在后续如果服务启动异常或服务发版时,就需要明确识别各服务的开机启动方案,然后做相应的操作,提高运维成本,增加出错概率。
七、开机启动脚本示例
7.1 追加启动命令到 /etc/rc.local 或 /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
# 开机启动脚本/usr/local/AutoStartOnBoot.sh
chmod +x /usr/local/AutoStartOnBoot.sh
# 本脚本需要依赖/etc/rc.d/rc.local
# rc.local在加载环境变量之前执行,所以此处需要人工加载
source /etc/profile
八、总结
通过本文档介绍的多种开机自启动方案,用户可以根据不同的服务类型和业务需求,选择最合适的方法来实现 Linux 系统服务的开机自启动。在生产环境中,统一的开机自启动方案有助于降低运维成本,提高系统的稳定性和可维护性。