Linux 在重启过程某些任务因默认超时策略为 “no limit”,导致重启时间过长。
以下是启动示例:
[ *** ] A start job is running for /etc/rc.local Compatibili...(20min 30s / no limit)
优化方式是定位自己环境中长时间运行的任务。修改启动配置
如上图的 “/etc/rc.local” 任务
[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 "# 单位是秒,0为不限制。添加该值,控制systemd 风格的启动程序超时时长"
RemainAfterExit=yes
SysVStartPriority=99 "#添加这个配置 控制sysv 风格的启动程序或脚本超时时长"
另外一种优化方式使用延时启动的方式,修改启动文件。
[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
ExecStartPre=/bin/sleep 30 "# 设定预启动指令进行延时,规避该服务堵塞系统启动”
第三种方式,如果你足够了解systemd.service.Type服务类型,可以为长时间运行的任务选择合适的类型,进行规避
simple:
默认值,如果设置了 ExecStart= 但没有设置 Type=,则默认为此类型。
ExecStart= 指定的进程是服务的主进程。
systemd 认为在创建了该服务的主服务进程之后,该服务就已经启动完成。
适用于大多数前台或后台运行的服务。
forking:
服务进程会在启动过程中使用 fork() 系统调用。
父进程在启动成功并创建好所有通信渠道后退出,子进程作为主服务进程继续运行。
systemd 认为在父进程退出之后,该服务就已经启动完成。
适合传统的守护进程,因为这些进程在启动时会自行 fork 一个子进程到后台,然后父进程退出。
oneshot:
类似于 simple,但只会执行一次 ExecStart= 指定的进程。
不会一直监控这个进程是否正常,进程执行完成退出后,不会重新启动这个进程。
适用于一次性任务,如初始化脚本。
通常需要设置 RemainAfterExit= 选项,以指示进程退出后服务仍然保持执行状态。
dbus:
服务通过 D-Bus 启动。
类似于 simple,但会等待 D-Bus 信号后启动。
该服务只有获得了 BusName= 指定的 D-Bus 名称之后,systemd 才会认为该服务启动完成。
适用于需要通过 D-Bus 进行通信的服务。
notify:
服务启动完毕后,会发出通知信号通知 systemd。
systemd 收到通知信号后,才会认为服务启动完成。
适用于那些进程启动后需要一段时间进行初始化的服务,如数据库服务。
要求服务进程具有发送通知信号的能力。
idle:
类似于 simple,但会延迟启动 ExecStart= 指定的进程。
systemd 会等待所有其他初始化任务完成后,再执行 ExecStart= 指定的进程。
适用于那些需要在系统空闲时运行的服务,以减少启动过程中的拥堵。
每种启动类型都有其特定的使用场景和适用条件。在选择启动类型时,需要根据服务的实际需求和运行特性进行综合考虑。同时,还需要注意其他相关配置选项的设置,以确保服务的正确启动和稳定运行。