Linux-开机启动自动运行脚本

总的说来,根据系统的不同,有两种实现开机自启的方法:rc.localsystemd

rc.local

树莓派官方文档对rc.local的介绍。值得注意的是:运行一个常驻脚本或者需要执行时间很长的脚本的时候,需要在命令最后加上&来表明这条命令需要后台运行。否则会阻塞rc.local后面的脚本执行。
除此之外,不是所有的命令都支持使用rc.local的方式开机运行。
https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

  1. 创建一个脚本文件
1
sudo nano my_script.sh

脚本内容:

1
2
3
4
#!/bin/sh
touch /home/pi/test.txt
chmod 777 /home/pi/test.txt
echo "Hello Pi" >> /home/pi/test.txt

该shell 代码中,指定运行方式为sh,在pi 目录创建一个test.txt 文件,并添加权限
最后将Hello Pi 语句定向到该txt 文件中
保存,退出。

  1. my_script.sh文件添加执行权限:
1
chmod 777 my_script.sh

在此也可先测试一下脚本运行情况:

1
./my_script.sh

然后可以发现/home/pi目录下多了test.txt文件

  1. 将该文件设置为开机自启:
    首先打开rc.local文件
1
sudo nano /etc/rc.local

然后在exit 0前面添加如下代码:

1
su pi -c "exec /home/pi/my_script.sh"

su将会切换为pi用户执行文件,且执行完后切换为原来用户。
保存即可。
随后开机便会发现/home/pi目录下多了一个test.txt文件

  1. 若是要开机自启其他类型的文件,例如/home/pi下的abc.py文件,则先进入rc.local文件:
1
sudo nano /etc/rc.local

然后添加:

1
sudo python /home/pi/abc.py &

最后的&代表在后台运行

service命令

service命令其实是去/etc/init.d目录下,去执行相关程序
/etc/init.d/目录下新建一个服务脚本文件。
在终端输入并回车pi@raspberry:~ $ sudo vi /etc/init.d/script_test
在空白文件中输入以下内容:

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
#!/bin/sh
#/etc/init.d/script_test
### BEGIN INIT INFO
# Provides:Nick
# Required-Start:$remote_fs $syslog
# Required-Stop:$remote_fs $syslog
# Default-Start:2 3 4 5
# Default-Stop:0 1 6
# Short-Description: script_test
# Description: This service is used to start my applaction
### END INIT INFO
case "$1" in
start)
echo "start your app here."
su pi -c "touch script_test2"
;;
stop)
echo "stop your app here."
;;
*)
echo "Usage: service script_test start|stop"
exit 1
;;
esac
exit 0

保存退出。设置脚本可执行权限:pi@raspberry:~ $ sudo chmod 777 /etc/init.d/script_test
最后将该脚本作为服务设置开机自动加载:
pi@raspberry:~ $ sudo update-rc.d script_test defaults
sudo reboot重启测试。

systemd systemctl

systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl
参看:
systemctl Linux-服务管理命令-systemctl
service Linux-服务管理命令-service
Linux 服务管理两种方式service和systemctl https://www.cnblogs.com/shijingjing07/p/9301590.html

这个的作用是:将需要开机启动的命令变成一个service(服务),来实现开机运行的目的。
https://www.raspberrypi.com/documentation/computers/using_linux.html#the-systemd-daemon

1
2
3
4
5
6
# 禁止自启动服务
systemctl disable transmission-daemon.service
# 查询服务自启动状态
systemctl is-enabled transmission-daemon.service
# 停止服务
systemctl stop transmission-daemon.service

我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体。

systemctl is-enabled iptables.service
systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
systemctl –failed #显示启动失败的服务
注:*代表某个服务的名字,如http的服务名为httpd


Linux-开机启动自动运行脚本
https://dnacore.github.io/post/a48a57bd-a28b-49a3-a8f9-4810c89131b7.html
作者
DNACore
发布于
2019年12月9日
更新于
2023年7月4日
许可协议