Linux 系统中设置开机启动脚本
Linux 系统中设置开机启动脚本有多种方法,适用于不同的场景和需求。以下是几种最常用且详细的方法:
核心理念: 无论哪种方法,核心都是让系统在启动过程中的某个阶段执行你的脚本。
1. 使用 systemd
(推荐,现代 Linux 发行版的标准)
systemd
是目前大多数主流 Linux 发行版(如 Ubuntu 16.04+, CentOS 7+, Debian 8+, Fedora 15+)使用的初始化系统和服务管理器。这是最强大、最灵活且推荐的方法。
你需要创建一个 "service unit" 文件来告诉 systemd
如何管理你的脚本。
步骤:
-
编写你的启动脚本:
- 确保脚本有正确的 shebang (例如
#!/bin/bash
或#!/usr/bin/env python3
)。 - 赋予脚本执行权限:
chmod +x /path/to/your/script.sh
- 重要:在脚本中尽量使用绝对路径来调用命令和访问文件,因为启动时的环境变量可能与你登录后不同。
- 考虑在脚本中添加日志记录,方便排错。
#!/bin/bash # /usr/local/bin/my_startup_script.shLOG_FILE="/var/log/my_startup_script.log"echo "$(date): My startup script is running..." >> $LOG_FILE # 在这里添加你的命令 # 例如:/usr/bin/python3 /opt/my_app/main.py >> $LOG_FILE 2>&1 # 例如:/usr/sbin/another_service --config /etc/another_service.conf >> $LOG_FILE 2>&1 echo "$(date): My startup script finished." >> $LOG_FILEexit 0
- 确保脚本有正确的 shebang (例如
-
创建
systemd
service unit 文件:- Unit 文件通常放在
/etc/systemd/system/
目录下。 - 文件名以
.service
结尾,例如my_script.service
。
# /etc/systemd/system/my_script.service[Unit] Description=My Custom Startup Script After=network.target network-online.target # 指定在网络服务启动后运行 (如果脚本需要网络) # Wants=network-online.target (如果只是希望网络在线,但不是硬性要求)[Service] Type=simple # 或者 oneshot (如果脚本执行完就退出,不作为守护进程) ExecStart=/usr/local/bin/my_startup_script.sh User=root # 指定运行脚本的用户,可以是普通用户,更安全 # Group=yourgroup # 指定运行脚本的用户组 # WorkingDirectory=/opt/my_app # 如果脚本需要特定的工作目录 # Restart=on-failure # 如果脚本失败,可以配置自动重启 # RestartSec=5s # 重启前等待的时间 # Environment="MY_VAR=some_value" # 设置环境变量[Install] WantedBy=multi-user.target # 表示在多用户模式下启动 (标准的服务器运行级别) # WantedBy=graphical.target (如果需要在图形界面启动后运行)
[Unit]
部分解释:Description
: 服务的描述。After
: 定义此服务应该在哪些服务之后启动。network.target
表示网络基本配置完成,
- Unit 文件通常放在