Linux中常见几种自启动方式的区别

在Linux中,有多个机制可以实现开机自启动,它们在不同的初始化系统(如SysVinit、systemd)下有不同的表现。以下是一些常见的自启动方法及其区别:

/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
6. 验证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系统中,配置服务或应用程序开机自启动的方法取决于系统的初始化系统和版本。以下是几种常见的配置方式: ### 使用 `systemctl` 管理开机自启动 对于使用 **Systemd** 的现代Linux发行版(如CentOS 7+、Ubuntu 16.04+等),可以通过创建`.service`文件来定义服务,并使用 `systemctl` 命令管理其自启动状态。例如: ```bash sudo systemctl enable your-service-name.service ``` 该命令会创建一个符号链接到相应的启动目标目录中,确保服务在系统启动时被激活[^4]。 ### 通过 `chkconfig` 管理服务 在基于SysV init的旧版Linux系统中,可以使用 `chkconfig` 工具来设置服务开机自启动。例如,启用某个服务的开机自启: ```bash sudo chkconfig your-service-name on ``` 此方法适用于Red Hat Enterprise Linux (RHEL) 和 CentOS 6.x 等系统[^1]。 ### 利用 `/etc/rc.local` 脚本 无论系统是否使用Systemd或SysV init,都可以将需要执行的命令添加到 `/etc/rc.local` 文件中。这个脚本会在所有其他服务启动之后运行。需要注意的是,如果脚本依赖某些环境变量(如Java环境变量),则应在脚本中显式地设置这些变量,否则可能导致服务无法正确启动[^2]。 ### 编写并启用 `init.d` 脚本 对于仍然使用传统的 SysV init 系统的服务,可以在 `/etc/init.d/` 目录下创建启动脚本,并通过更新启动级别链接来启用它们。例如: ```bash sudo update-rc.d your-service-name defaults ``` 这将根据默认的运行级别配置服务的自启动状态[^1]。 ### 创建 Systemd 服务单元文件 为了更规范地管理和配置服务,特别是对于新版本Linux系统,建议编写一个 `.service` 单元文件并放置在 `/etc/systemd/system/` 或 `/usr/lib/systemd/system/` 目录下。然后使用 `systemctl` 命令来启用该服务。例如,服务文件可能包含以下内容: ```ini [Unit] Description=Your Service Description After=network.target [Service] User=your-user ExecStart=/path/to/your/application Restart=always [Install] WantedBy=multi-user.target ``` 保存为 `your-service-name.service` 后,通过以下命令启用服务: ```bash sudo systemctl enable your-service-name.service ``` 这种方法提供了对服务行为的精细控制,并支持依赖关系管理、重启策略等功能[^5]。 ### 配置特定应用程序(如Tomcat)的自启动 针对像Tomcat这样的应用服务器,直接将启动命令添加到 `/etc/rc.local` 可能因为环境变量未设置而失败。因此,推荐创建一个专门的启动脚本,在其中设置必要的环境变量后再启动服务。例如: ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 /path/to/tomcat/bin/startup.sh ``` 确保脚本具有可执行权限,并将其路径添加到 `/etc/rc.local` 中以实现开机自启动。 ### 配置 JAR 包的自启动 对于Java应用程序打包成的JAR文件,同样需要考虑环境变量的问题。可以在 `/etc/init.d/` 下创建一个启动脚本,或者直接在 `/etc/rc.local` 中调用带有完整路径和环境设置的Java命令来运行JAR包。此外,也可以为JAR包创建一个Systemd服务单元文件,确保其在系统启动时自动运行[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值