/etc/rc.local:
这是传统的sysvinit系统中的自启动脚本。在系统启动到指定运行级别时,会执行这个文件中的命令。
在使用systemd的系统中,为了兼容性,通常有一个rc-local.service来运行/etc/rc.local。但需要确保该服务被启用。
使用rc.local比较简单,只需将需要开机自启动的命令写入该文件即可。但注意,该文件默认可能没有执行权限,需要确保其有执行权限。
具体操作方式
1. 创建或编辑rc.local文件
sudo vim /etc/rc.local
2. 添加内容
写入自启动脚本
#!/bin/bash sudo -u pharmacy /home/services/rcs/start_rcs.sh & sudo -u pharmacy /home/abc.sh & sudo -u pharmacy /home/edf.sh & # 添加日志以便调试 echo "$(date): rc.local executed successfully" >> /var/log/rc-local.log exit 0
3. 给文件添加执行权限
sudo chmod +x /etc/rc.local
4. 启用rc-local服务(如果尚未启用)
启用rc-local服务:、
sudo systemctl enable rc-local
启动服务:
sudo systemctl start rc-local
在这里如果提示如下,说明rc-local没有被systemctl管理到,那么需要新增service配置
the unit files have no installation config (wantedby=, requiredby=, also=, alias= settings in the [install] section, and defaultinstance= for template units). this means they are not meant to be enabled using systemctl. possible reasons for having this kind of units are: • a unit may be statically enabled by being symlinked from another unit's .wants/ or .requires/ directory. • a unit's purpose may be to act as a helper for some other unit which has a requirement dependency on it. • a unit may be started when needed via activation (socket, path, timer, d-bus, udev, scripted systemctl call, ...). • in case of template units, the unit is meant to be enabled with some instance name specified.
5.新增service 配置
sudo tee /etc/systemd/system/rc-local.service > /dev/null << 'eof' [unit] description=/etc/rc.local compatibility conditionfileisexecutable=/etc/rc.local after=network.target [service] type=forking execstart=/etc/rc.local start timeoutsec=0 remainafterexit=yes [install] wantedby=multi-user.target eof
6. 重新加载 systemd 并启用服务
sudo systemctl daemon-reload sudo systemctl enable rc-local.service sudo systemctl start rc-local.service sudo systemctl status rc-local.service
7. 验证rc-local服务是否启用
sudo systemctl status rc-local.service
如果服务状态显示为active 则表示服务已经运行,下方会显示脚本的执行打印日志和时间
/etc/init.d/(sysvinit脚本):
在sysvinit系统中,每个运行级别都有对应的目录(如/etc/rc0.d~/etc/rc6.d),这些目录中的符号链接指向/etc/init.d/中的脚本。
可以通过update-rc.d(在debian/ubuntu中)或chkconfig(在redhat/centos中)来管理这些链接,从而控制服务在哪个运行级别启动或停止。
这种方式较为传统,现在逐渐被systemd取代。
systemd:
现代大多数linux发行版使用systemd作为初始化系统。
用户可以通过创建自定义的service单元文件(通常放在/etc/systemd/system/目录下)来管理自启动服务。
使用systemctl enable service_name来启用自启动,使用systemctl start service_name来立即启动服务。
systemd提供了更强大的功能,如依赖管理、条件启动、资源控制等。
使用方式
下方例子是启动指定脚本,然后在脚本中执行程序启动,不监视程序是否停止运行且不会重启,目标只是为了实现简单的自动启动。另外修改service内容,可以支持自启动和崩溃重启。
rcs.service 文件内容(只做开启自启动,不做程序退出检测和退出后的后的自启动)
[unit] description=run jd rcs after=network.target [service] type=oneshot execstart=/home/services/rcs/start_rcs.sh user=iamuser group=iamuser workingdirectory=/home/prod/rcs/build/ remainafterexit=yes [install] wantedby=multi-user.target
- type=oneshot:适用于只执行一次然后退出的服务
- 移除了 execstop:因为 oneshot 类型不需要停止脚本
- 保留 remainafterexit=yes:让 systemd 知道服务已"激活",即使主进程已退出
cron:
使用@reboot选项,可以在系统启动时运行指定的命令或脚本。
例如,在crontab中添加@reboot /path/to/script。
具体为:
crontab -e
添加以下行
@reboot /path/to/your/script.sh
这种方法简单,但不适合需要复杂依赖关系或需要作为守护进程运行的服务。
/etc/rc.d/rc.local(在某些发行版中):
类似于/etc/rc.local,在一些传统的发行版中(如redhat/centos 6及以下)使用。
~/.config/autostart(桌面环境自启动):
对于图形界面环境,用户可以在~/.config/autostart目录下放置.desktop文件,以便在用户登录时自动启动应用程序。
/etc/xdg/autostart(系统级别的桌面自启动):
与用户级别的自启动类似,但是应用于所有用户。
区别总结:
适用范围:rc.local和sysvinit脚本通常用于系统级别的启动,而cron和桌面自启动可以用于用户级别。
灵活性:systemd提供了最灵活和强大的管理方式,可以处理复杂的依赖和条件。
兼容性:rc.local和sysvinit脚本在较老的系统中常见,而systemd是现代系统的标准。
使用简便性:对于简单的启动任务,rc.local和cron的@reboot可能更简单。
在选择自启动方法时,需要考虑你的发行版使用的初始化系统以及你的具体需求(如是否需要在图形界面启动后运行、是否需要守护进程等)。
在这里插入图片描述

推荐使用建议
- 系统服务:使用systemd(现代标准)
- 简单个人任务:使用cron @reboot或rc.local
- gui应用:使用桌面环境自启动
- 兼容性考虑:rc.local在大多数系统仍可用
选择哪种方式取决于你的具体需求、系统版本和使用场景。
以上就是linux中实现开机自启动的几种常见方式及区别详解的详细内容,更多关于linux开机自启动方式的资料请关注代码网其它相关文章!
发表评论