Linux 开机自启程序

在开发智能硬件产品时,经常需要在 Linux 系统下,设置程序随系统启动而自动运行。 本文总结了常用的三种方法

实验环境:

  • OS: Ubuntu_12.04 / Ubuntu_17.10 / Dietpi_V154 / Raspbian_8

方法一:借助 systemd 工具管理

systemd 是一款 Linux 系统工具,用来启动守护进程,已成为众多 Linux 的标准配置。

配置文件位于 /etc/systemd/ 路径下。具体参阅:

简单实现 systemd 管理的过程方法

第一步 创建 .service 文件

1
$ vim /etc/systemd/system/[name].serveice

样例如下,实现目的是确保 Network Ready 后再启动目标进程

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Run after network
After=network.target multi-user.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/order
ExecReload=/home/order

[Install]
WantedBy=multi-user.target

  • [Unit] 中 After 定义了启动顺序,可以通过 systemd-analyze critical-chain 来确定具体的内容;
  • [Service] 中 ExecStart / ExecReload 定义了服务所调取的脚本。

第二步 激活 .service 文件

1
2
$ systemctl enable [name].serveice
$ systemctl daemon-reload

方法二:借助 init.d 实现

init 进程是 Linux 历史悠久的进程启动方式,系统的 /etc/init.d/ 目录维护初始化服务,具体可以参阅:

实现 init.d 服务管理的过程方法

第一步 创建 service 文件

1
$ vim /etc/init.d/homebase  # Fedora系统目录路径在 /etc/rc.d/init.d/

内容如下,Required-Start 项指明了启动前置条件

Dietpi_V154 Kernel 3.4.113 Required-Start: $network 测试失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# /etc/init.d/homebase

### BEGIN INIT INFO
# Provides: Quentin
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: homebase gateway
# Description: This service is used to start ssdp and jsonrpc serice for homebase
### END INIT INFO

case "$1" in
start)
echo "Starting Homebase SSDP"
python3 /root/homebase-ssdp/homebase.py &
;;
stop)
echo "Stopping Homebase SSDP"
kill $( ps aux | grep -m 1 'python3 /root/homebase/homebase.py' | awk '{ print $2 }' )
;;
*)
echo "Usage: service Homebase SSDP start|stop"
exit 1
;;
esac
exit 0

第二步 增加可执行权限

1
$ chmod +x /etc/init.d/homebase

第三步 设置开机自启

1
$ update-rc.d homebase defaults

第四步 service 管理技巧

可以随时通过 service XXX start|stop|restart 控制程序状态,还可以通过status查看服务的详细运行信息

1
$ service XXX status    # 查看服务状态

方法三:借助 rc.local 实现入口

/etc/rc.local 是系统初始化完成后会执行的脚本,可以安全的在里面添加自定义程序的启动入口,这种方法最为常用。 该文件的格式一般为:

1
2
3
4
#!/bin/bash
...
...
exit 0

入口指令需要添加在 exit 0 之前。