推荐使用 systemd 将可执行程序注册为系统服务:将程序放入标准路径并赋权,编写 /etc/systemd/system/myapp.service 单元文件,执行 systemctl daemon-reload、enable、start 完成开机自启与统一管理。

把可执行程序加入 Linux 开机启动项并纳入系统服务管理,核心是让它能被 systemctl 或 service 命令统一控制(如 systemctl start myapp),同时支持开机自动运行。方法取决于你用的发行版和 init 系统:主流现代发行版(CentOS 7+/RHEL 7+、Ubuntu 16.04+、Debian 8+)默认使用 systemd;较老系统(如 CentOS 6)仍用 SysV init(/etc/init.d)。下面分两类说明,优先推荐 systemd 方式。
用 systemd 注册为系统服务(推荐,适用于大多数新系统)
这是当前标准做法,稳定、功能全、依赖管理清晰。
-
步骤 1:确保程序可独立运行
把你的可执行文件(比如
mydaemon)放到标准路径,如/usr/local/bin/或/opt/myapp/bin/,并确认它有执行权限:chmod +x /usr/local/bin/mydaemon -
步骤 2:编写服务单元文件
创建文件
/etc/systemd/system/myapp.service,内容类似:
[Unit] Description=My Custom Application After=network.target <p>[Service] Type=simple User=nobody WorkingDirectory=/var/lib/myapp ExecStart=/usr/local/bin/mydaemon --config /etc/myapp/config.yml Restart=always RestartSec=5 StandardOutput=journal StandardError=journal</p><p>[Install] WantedBy=multi-user.target </p>
-
步骤 3:启用并测试
sudo systemctl daemon-reload(重载配置)sudo systemctl enable myapp.service(设为开机自启)sudo systemctl start myapp.service(立即启动)sudo systemctl status myapp(查看状态与日志)
用 SysV init 脚本注册(兼容旧系统或特殊需求)
适用于 CentOS 6、Debian 7 等仍在用 /etc/init.d 的环境。
-
步骤 1:写一个标准 init 脚本
保存为
/etc/init.d/myapp,开头必须含 LSB 注释块(否则chkconfig或update-rc.d可能报错):### BEGIN INIT INFO<br> # Provides: myapp<br> # Required-Start: $local_fs $network<br> # Required-Stop: $local_fs<br> # Default-Start: 2 3 4 5<br> # Default-Stop: 0 1 6<br> # Short-Description: My custom daemon<br> ### END INIT INFO
然后定义start()、stop()、status()函数,调用你的二进制并管理 PID 文件。 -
步骤 2:添加执行权限并注册
sudo chmod +x /etc/init.d/myapp
CentOS/RHEL:sudo chkconfig --add myapp && sudo chkconfig myapp on
Debian/Ubuntu:sudo update-rc.d myapp defaults -
步骤 3:验证
sudo service myapp startsudo chkconfig --list myapp(或ls /etc/rc?.d/*myapp)
补充说明:不推荐但偶尔用到的方式
/etc/rc.local 是最简方案,适合调试或临时任务:
编辑 /etc/rc.local(确保文件末尾有 exit 0),在它之前插入一行:/usr/local/bin/mydaemon --daemon > /dev/null 2>&1 &
然后 sudo chmod +x /etc/rc.local。⚠️ 注意:systemd 系统中需先启用该服务:sudo systemctl enable rc-local,且它不提供进程监控、重启、依赖管理等能力。
关键点在于:服务化不是“放个命令就行”,而是明确声明生命周期、用户权限、失败响应和依赖关系。systemd 方式更健壮,应作为首选;init.d 方式仅用于兼容场景。只要服务文件写对、权限设好、启用命令执行成功,你的程序就真正进入了系统服务链。











