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

news/2024/9/21 21:39:33 标签: ubuntu, linux, 运维

本文章的开机自启动脚本结合.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.niftyadmin.cn/n/5669488.html

相关文章

DHCP协议原理(网络协议)

DHCP简介 定义 DHCP&#xff08;动态主机配置协议&#xff09;是一种网络管理协议&#xff0c;能够自动为局域网中的每台计算机分配IP地址及其他网络配置参数&#xff0c;包括子网掩码、默认网关和DNS服务器等。这一机制极大简化了网络管理&#xff0c;尤其在大型局域网中&am…

typescript控制语句

TypeScript 条件语句、循环语句与函数学习心得 一、条件语句 条件语句是控制程序执行路径的核心工具&#xff0c;它让程序根据不同的条件执行不同的代码。TypeScript 中常用的条件语句包括 if、if...else、if...else if...else 和 switch。 1. if 语句 if 语句用于在条件为…

关于一些Spring的配置的作用

文章目录 spring.profiles.activejmx.default-domainmain.allow-bean-definition-overridingmain.allow-circular-referencescloud.nacoscloud.nacos.configcloud.nacos.shared-configsmvc.pathmatch.matching-strategy spring:profiles:active: ${config.profile}# include…

使用Apify加载Twitter消息以进行微调的完整指南

# 使用Apify加载Twitter消息以进行微调的完整指南## 引言在自然语言处理领域&#xff0c;微调模型以适应特定任务是提升模型性能的常见方法。本文将介绍如何使用Apify从Twitter导出聊天信息&#xff0c;以便进一步进行微调。## 主要内容### 使用Apify导出推文首先&#xff0c;我…

记录一次ubuntu /mysql/redis/nginx等 系统安装

没想到还会做一次系统安装配置类的工作&#xff0c;没办法&#xff0c;碰到问题了&#xff0c;总得解决。 安装 &网络配置 从网上下载了ubuntu 18.04.6的安装包&#xff0c;用UltraISO做安装盘&#xff0c;到服务器上修改了下启动顺序&#xff0c;ubuntu的安装非常简单&a…

cmake--get_filename_component

作用 按照指定的方式获取文件或者目录的信息。 使用 get_filename_component(<variable> <filename> <component>) variable: 用于保存提取的信息。 filename: 指定路径的文件或者目录。 component: 链接1 component DIRECTORY: 提取文件或者目录的父…

查找算法 01分块查找

自己设计一个分块查找的例子&#xff0c;不少于15个数据元素&#xff0c;并建立分块查找的索引 基于上述例子&#xff0c;计算查找成功的ASL、查找失败的ASL 拓展&#xff1a; ‌‌分块查找的平均查找长度&#xff08;‌ASL&#xff09;的计算公式如下‌&#xff1a;‌ ‌顺序…

浅谈C++之运算符

一、基本介绍 运算符是描述对数据进行的运算(操作)、体现数据之间运算关系的符号&#xff0c;运算符也叫操作符。 二、运算符分类 算术运算符&#xff1a;用于执行基本的数学运算。 &#xff08;加&#xff09;-&#xff08;减&#xff09;*&#xff08;乘&#xff09;/&#x…