当前位置: 首页 > article >正文

JetsonNano、Ubuntu开机自启动脚本编写(一遍过)

本文章的开机自启动脚本结合.service文件和gnome工具来实现。
需要实现的功能大概是:初始化(给端口权限)板卡与下位机(STM32)相连的串口,然后运行相关的python代码。
参考文章:

  1. Jetson nano开机自启动程序-CSDN博客
  2. ubuntu使用bash脚本+gnome实现开机自启python程序和崩溃重启_gnome-session-properties启动不了-CSDN博客
  3. Ubuntu USB设备端口号绑定_ubuntu多usb口排序编号-CSDN博客

端口重命名

板卡接上串口后(假如只接一个),我们会发现大多时候在/dev路径下查找,对应的端口号都是ttyUSB0,但有些时候并不是,可能会被识别成ttyUSB1或者ttyUSB2。由于默认的端口命名可能存在变化,会影响我们对该端口的初始化,所以这里先做个端口重命名

  1. 通过lsusb查看新增的设备,并记录下串口对应的ID,我的是ID 1a86:7523
  2. /etc/udev/rules.d/下创建任意名称的规则配置文件,我的是uart-usb.rules
  3. 编辑内容:`KERNEL==“ttyUSB*”,ATTRS{idVendor}“1a86”, ATTRS{idProduct}“7523”, SYMLINK+=“my_uart”
  4. 重置规则:sudo /etc/init.d/udev restart
  5. 这时再执行lsusb会发现新端口my_uart,这个端口实际上是映射到ttyUSB*上的

service文件编写

端口确定后,我们就可以进行service文件的编写。

  1. 首先创建一个shell脚本文件,名字自定义:uart_init.sh
  2. 编写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
  1. 创建一个service文件,名字自定义,我的是start.service
  2. 编写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
  1. 然后给sh和service文件777的权限:
sudo chmod 777 uart_init.sh
sudo chmod 777 start.service
sudo mv start.service /etc/systemd/system
  1. 启动服务函数:(需要输入两次密码)
systemctl daemon-reload 
systemctl enable start.service 
sudo reboot // 重启系统
  1. 系统重启后执行tail -f /var/log/syslog可以发现uart_init.sh脚本进程输出,证明该段代码已经实现开机自启动。
  2. 这时这个脚本运行的就是一种守护进程,可以通过sudo kill -9 <PID>来强制终止这个进程(但一般没必要)

gnome工具使用

上一部分是端口权限初始化的,如果你还有其他操作想开机自启动,然后输出打印到syslog,当然也可以把相关操作代码写到uart_init.sh脚本中。
我这里由于想开机后自动弹出终端,通过远程桌面观察调试,所以在gnome工具里添加另一端脚本代码。

  1. 创建一个脚本,来执行相关操作,我这里交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"
  1. 终端输入gnome-session-properties
  2. 添加对应的指令,我的是bash my_run.sh,保存退出重启即可。

http://www.kler.cn/news/315385.html

相关文章:

  • ELFK日志分析平台,架构和通信
  • 10.解析解方法推导线性回归——不容小觑的线性回归算法
  • Oracle ADG主备停机小版本升级
  • (七)使用SoapUI工具调用WebAPI
  • 学习Java(一)类和对象
  • weblogic CVE-2018-2894 靶场攻略
  • 基于YOLOv5的教室人数检测统计系统
  • 浅谈Linux中文件与目录的ACL
  • MAC 禁用 DS_Store 文件
  • tomcat,el表达式执行带参数命令,字符串数组,String[],el表达式注入
  • leetcode155.最小栈,两个栈
  • TypeError: a bytes-like object is required, not ‘str‘ - 完美解决方法
  • 区块链行业DDoS防护:直面DDoS攻击
  • 【Linux】初识信号与信号产生
  • 非root用户安装Mysql8.0
  • python函数的一些介绍
  • 人物一致性
  • [数据集][目标检测]红外微小目标无人机直升机飞机飞鸟检测数据集VOC+YOLO格式7559张4类别
  • 【嵌入式人工智能】嵌入式AI在物联网中如何应用
  • CORS跨域+Nginx配置、Apache配置
  • Python | Leetcode Python题解之第421题数组中两个数的最大异或值
  • 【PSINS】基于PSINS工具箱的EKF+UKF对比程序|三维定位|组合导航|MATLAB
  • NoSql数据库Redis知识点
  • ppt一键生成免费版软件有哪些?如何高效生成论文答辩?
  • kafka发送事件的几种方式
  • DeepCross模型实现推荐算法
  • 【软件测试】--xswitch将请求代理到测试桩
  • 【linux】df命令
  • 『玉竹』基于Laravel 开发的博客、微博客系统和Android App
  • Android 命令行关机