在 Linux 中设置程序开机自启动有多种方法,具体取决于你的发行版和需求。以下是 6 种主流方法 ,涵盖 systemd
、cron
、rc.local
等方式:
1. 使用 systemd(推荐,现代 Linux 发行版通用)
systemd
是大多数现代 Linux 系统(Ubuntu 20.04+、CentOS 7+、Debian 9+)的默认初始化系统。

步骤:
-
创建服务文件 (如
myapp.service
)sudo nano /etc/systemd/system/myapp.service
-
填写配置(以 Python 脚本为例):
ini
[Unit] Description=My Custom App After=network.target # 确保网络就绪后启动 [Service] Type=simple User=ubuntu # 运行用户 WorkingDirectory=/path/to/your/app ExecStart=/usr/bin/python3 /path/to/your/app/main.py Restart=always # 崩溃后自动重启 RestartSec=5 # 重启间隔(秒) [Install] WantedBy=multi-user.target # 多用户模式启动
-
启用并启动服务
sudo systemctl daemon-reload # 重新加载配置 sudo systemctl enable myapp.service # 设置开机自启 sudo systemctl start myapp.service # 立即启动
-
检查状态
sudo systemctl status myapp.service
2. 使用 /etc/rc.local(传统方法,适用于旧系统)
适用于支持 rc.local
的发行版(如 Ubuntu 18.04 之前版本)。
步骤:
-
编辑
/etc/rc.local
:sudo nano /etc/rc.local
-
在
exit 0
之前添加命令:/usr/bin/python3 /path/to/your/app/main.py &
注意 :末尾的
&
表示后台运行,避免阻塞启动流程。 -
赋予可执行权限:
sudo chmod +x /etc/rc.local
3. 使用 crontab(定时任务,灵活控制)
通过 @reboot
实现开机自启:
crontab -e # 编辑当前用户的 cron 任务
添加以下行:
@reboot /usr/bin/python3 /path/to/your/app/main.py
优点:无需 root 权限,适合用户级程序。
4. 使用 /etc/init.d(SysV Init 系统,旧版兼容)
适用于传统 SysV Init 系统(如 CentOS 6):
-
创建启动脚本:
sudo nano /etc/init.d/myapp
-
模板示例:
#!/bin/bash case "$1" in start) /usr/bin/python3 /path/to/your/app/main.py & ;; stop) pkill -f "main.py" ;; esac
-
赋予权限并注册服务:
sudo chmod +x /etc/init.d/myapp sudo update-rc.d myapp defaults # Ubuntu/Debian sudo chkconfig myapp on # CentOS/RHEL
5. 图形界面工具(适合桌面环境)
-
Ubuntu/Debian :使用
Startup Applications
(搜索"启动应用程序")。 -
GNOME :
gnome-session-properties
命令添加自启动项。
6. 使用 PM2(Node.js 工具,但可管理任意进程)
适合需要进程守护的场景:
-
安装 PM2:
npm install -g pm2
-
启动并设为自启:
pm2 start /path/to/your/app/main.py --name "myapp" --interpreter python3 pm2 save # 保存当前进程列表 pm2 startup # 生成自启动脚本
常见问题排查
-
权限问题
-
确保脚本和依赖文件对运行用户可读/可执行。
-
使用
chmod +x script.sh
赋予可执行权限。
-
-
环境变量丢失
-
在
systemd
服务文件中通过Environment
指定:ini
[Service] Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
-
-
日志查看
-
systemd
日志:journalctl -u myapp.service -f
-
rc.local
日志:/var/log/boot.log
-
总结
方法 | 适用场景 | 是否需要 root | 推荐指数 |
---|---|---|---|
systemd | 现代 Linux 服务器 | 需要 | ⭐⭐⭐⭐⭐ |
rc.local | 旧版系统/简单脚本 | 需要 | ⭐⭐ |
crontab @reboot | 用户级程序 | 不需要 | ⭐⭐⭐ |
/etc/init.d | SysV Init 系统兼容 | 需要 | ⭐⭐ |
图形工具 | 桌面环境 | 不需要 | ⭐⭐⭐ |
PM2 | 需要进程守护(跨平台) | 可选 | ⭐⭐⭐⭐ |
推荐优先级 :systemd
> crontab
> PM2
,其他方法仅在特定场景使用。