JetsonNano、Ubuntu开机自启动脚本编写(一遍过)
本文章的开机自启动脚本结合
.service
文件和gnome
工具来实现。
需要实现的功能大概是:初始化(给端口权限)板卡与下位机(STM32)相连的串口,然后运行相关的python代码。
参考文章:
- Jetson nano开机自启动程序-CSDN博客
- ubuntu使用bash脚本+gnome实现开机自启python程序和崩溃重启_gnome-session-properties启动不了-CSDN博客
- Ubuntu USB设备端口号绑定_ubuntu多usb口排序编号-CSDN博客
端口重命名
板卡接上串口后(假如只接一个),我们会发现大多时候在/dev
路径下查找,对应的端口号都是ttyUSB0
,但有些时候并不是,可能会被识别成ttyUSB1
或者ttyUSB2
。由于默认的端口命名可能存在变化,会影响我们对该端口的初始化,所以这里先做个端口重命名。
- 通过
lsusb
查看新增的设备,并记录下串口对应的ID,我的是ID 1a86:7523
。 - 在
/etc/udev/rules.d/
下创建任意名称的规则配置文件,我的是uart-usb.rules
- 编辑内容:`KERNEL==“ttyUSB*”,ATTRS{idVendor}“1a86”, ATTRS{idProduct}“7523”, SYMLINK+=“my_uart”
- 重置规则:
sudo /etc/init.d/udev restart
- 这时再执行
lsusb
会发现新端口my_uart
,这个端口实际上是映射到ttyUSB*
上的
service文件编写
端口确定后,我们就可以进行service文件的编写。
- 首先创建一个shell脚本文件,名字自定义:
uart_init.sh
- 编写shell脚本内容:
#!/bin/bash
echo "Try to give permission......"
while true
do
# 先判断设备是否存在
if [ -e /dev/my_uart ];then
# 存在则直接给权限
sudo chmod 777 /dev/my_uart
# $? 表示上一个命令的返回值,如果为0表示上一个命令执行成功
if [ $? -eq 0 ];then
echo "Successful!"
# 给完权限直接推出
exit 0
else
echo "Failed to give permission"
fi
else
echo "Device not found!"
fi
sleep 0.2
done
- 创建一个service文件,名字自定义,我的是
start.service
- 编写service文件的内容,ExecStart里要填上面那个sh文件的绝对路径
[Unit]
Description=Run a Custom Script at Startup
After=default.target
[Service]
ExecStart=/home/username/uart_init.sh
[Install]
WantedBy=default.target
- 然后给sh和service文件777的权限:
sudo chmod 777 uart_init.sh
sudo chmod 777 start.service
sudo mv start.service /etc/systemd/system
- 启动服务函数:(需要输入两次密码)
systemctl daemon-reload
systemctl enable start.service
sudo reboot // 重启系统
- 系统重启后执行
tail -f /var/log/syslog
可以发现uart_init.sh
脚本进程输出,证明该段代码已经实现开机自启动。 - 这时这个脚本运行的就是一种守护进程,可以通过
sudo kill -9 <PID>
来强制终止这个进程(但一般没必要)
gnome工具使用
上一部分是端口权限初始化的,如果你还有其他操作想开机自启动,然后输出打印到syslog,当然也可以把相关操作代码写到uart_init.sh脚本中。
我这里由于想开机后自动弹出终端,通过远程桌面观察调试,所以在gnome工具里添加另一端脚本代码。
- 创建一个脚本,来执行相关操作,我这里交
my_run.sh
#!/bin/bash
# 获取当前时间并格式化为所需的形式,例如:20240618181233
timestamp=$(date +"%Y%m%d%H%M%S")
# 定义文件名
filename="${timestamp}.txt"
# 输出 "nihao" 到文件中
# 如果运行的是python程序,文件最好都写绝对路径
$(which python) main.py > "$filename"
echo "nihao" > "$filename"
# 提示信息,显示写入的文件名
echo "内容已写入文件: $filename"
- 终端输入
gnome-session-properties
- 添加对应的指令,我的是
bash my_run.sh
,保存退出重启即可。