在 Ubuntu 20.04 中使用 init.d 或者systemd实现开机自动执行脚本

Ubuntu 20 默认使用的是 systemd 系统管理器,但传统的 SysV Init/etc/init.d/)脚本依然兼容并可用。本文将介绍如何通过 init.d 写脚本来在开机时自动设置某个 GPIO(如 GPIO407)为高电平,适用于嵌入式系统、开发板等场景。


一、为什么选择 init.d

虽然 systemd 是推荐方式,但对于一些老旧项目或驱动初始化问题,用 init.d 更加直观、简单,并且在某些设备初始化顺序依赖场景下依然非常实用。


二、创建并配置 init.d 脚本

1. 创建脚本

 

bash

复制编辑

sudo nano /etc/init.d/gpio407_init

2. 脚本内容如下:

 

bash

复制编辑

#!/bin/sh ### BEGIN INIT INFO # Provides: gpio407_init # Required-Start: $local_fs # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: Set GPIO407 high at boot ### END INIT INFO GPIO=407 case "$1" in start) echo "Exporting GPIO$GPIO and setting it HIGH..." if [ ! -e /sys/class/gpio/gpio$GPIO ]; then echo $GPIO > /sys/class/gpio/export sleep 0.1 fi echo out > /sys/class/gpio/gpio$GPIO/direction echo 1 > /sys/class/gpio/gpio$GPIO/value echo "GPIO$GPIO set to HIGH" ;; stop) echo $GPIO > /sys/class/gpio/unexport ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0


三、赋予脚本执行权限

 

bash

复制编辑

sudo chmod +x /etc/init.d/gpio407_init


四、注册为启动服务

将脚本注册到系统默认启动级别:

 

bash

复制编辑

sudo update-rc.d gpio407_init defaults

这会在 /etc/rc2.d/rc3.d/rc4.d/rc5.d/ 中创建符号链接,实现开机执行。


五、立即运行测试

你可以直接运行脚本验证功能是否正确:

 

bash

复制编辑

sudo /etc/init.d/gpio407_init start

验证:

 

bash

复制编辑

cat /sys/class/gpio/gpio407/value # 应输出 1


六、注意事项

  • 权限问题:脚本执行的所有 echo > /sys/... 操作必须使用 root 权限,直接用 sudo 执行整个脚本,不要对单独的 echo 使用 sudo,否则会因 shell 权限问题失败。

  • 脚本调试:可以在脚本中加入日志输出,例如 echo "xxx" >> /var/log/gpio.log 方便调试。

  • GPIO不可导出:如果 /sys/class/gpio/export 不存在,可能是内核不支持 GPIO sysfs 接口,需要启用相关内核选项。


七、其他:如何禁用脚本

如果不再需要该脚本,可以移除注册:

 

bash

复制编辑

sudo update-rc.d -f gpio407_init remove

然后手动删除脚本:

 

bash

复制编辑

sudo rm /etc/init.d/gpio407_init


八、总结

尽管 Ubuntu 20 已默认使用 systemd,但 init.d 脚本依然兼容且适用嵌入式控制、GPIO 操作等早期初始化需求。按照本文方法配置,可以轻松实现开机自动执行。

如需改为 systemd 方式,欢迎继续阅读或留言,我可以帮你转换为 .service 文件。

在 Ubuntu 20.04 中使用 systemd 实现 GPIO 上电(以 GPIO407 为例)

对于嵌入式 Linux 系统或开发板平台,我们常常需要在开机时自动设置 GPIO 引脚方向及电平。使用 systemd 编写自定义 .service 文件是一种推荐方式。


一、前提条件

  • 你必须有 root 权限

  • 目标 GPIO(如 GPIO407)可通过 /sys/class/gpio/ 接口操作。

  • Kernel 配置项开启了 CONFIG_GPIO_SYSFS


二、编写设置 GPIO 的脚本

1. 创建脚本文件

 

bash

复制编辑

sudo nano /usr/local/bin/gpio407_set_high.sh

2. 填写内容如下:

 

bash

复制编辑

#!/bin/bash GPIO=407 # Export GPIO if not already exported if [ ! -d "/sys/class/gpio/gpio$GPIO" ]; then echo $GPIO > /sys/class/gpio/export sleep 0.1 fi # 设置方向为输出,并拉高 echo out > /sys/class/gpio/gpio$GPIO/direction echo 1 > /sys/class/gpio/gpio$GPIO/value

3. 设置脚本权限

 

bash

复制编辑

sudo chmod +x /usr/local/bin/gpio407_set_high.sh


三、创建 systemd 服务文件

1. 创建服务文件

 

bash

复制编辑

sudo nano /etc/systemd/system/gpio407.service

2. 内容如下:

 

ini

复制编辑

[Unit] Description=Set GPIO407 High at boot After=multi-user.target [Service] Type=oneshot ExecStart=/usr/local/bin/gpio407_set_high.sh RemainAfterExit=true [Install] WantedBy=multi-user.target

说明:

  • Type=oneshot 表示只执行一次,不常驻。

  • RemainAfterExit=true 保留“已启动”状态。

  • WantedBy=multi-user.target 表示在正常系统运行级别启动。


四、启用服务并重启

启用服务

 

bash

复制编辑

sudo systemctl enable gpio407.service

立即启动(测试)

 

bash

复制编辑

sudo systemctl start gpio407.service

查看状态

 

bash

复制编辑

sudo systemctl status gpio407.service


五、验证 GPIO 是否设置成功

 

bash

复制编辑

cat /sys/class/gpio/gpio407/value # 应该输出 1


六、卸载或禁用服务

如不再需要:

 

bash

复制编辑

sudo systemctl disable gpio407.service sudo rm /etc/systemd/system/gpio407.service sudo rm /usr/local/bin/gpio407_set_high.sh


七、与 init.d 的比较

项目init.dsystemd
兼容性兼容但过时推荐使用
并发支持
状态管理简单细致、支持依赖
日志需手动自动记录(journalctl


八、结语

使用 systemd 管理 GPIO 初始化是一种现代、清晰、可靠的方式,特别适合在需要严格控制启动顺序、可靠运行的环境中。建议优先采用这种方式进行嵌入式系统自启动脚本部署。

如果你还需要同时配置多个 GPIO 或串口、电源等资源,也可以在脚本中统一处理,systemd 会一次完成初始化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果的人工智能领域慢热

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

FastAPI使用@app.get/@app.post等装饰器注册路由无效404 Not Found

(一)问题描述 使用app.get注册路由,前端发送请求访问路径和路由一致,但一直显示404 Not Found,检查了好几遍,确认没有访问路径不一致的问题。 在Swagger文档里查看,也没有找到这个新添加的接口。…

制作我的计算器

1. 界面布局 新建项目 MyCalculator,开始布局。 2. 静态布局 代码如下: // etc/pages/Index.ets Entry Component struct Index {build() {Column() {/*** 运算区*/Column() {TextInput({ text: 12x13 }).height(100%).fontSize(32).enabled(false).f…

2025-5-17Vue3快速上手

1、ref对比reactive 区别第2点:本质是指针指向问题 整体修改reactive的数据时,有坑 使用原则需要根据项目原本的代码灵活参考 如果要更新的数据是从服务器获取回来的,用Object.assign是好方法,需要注意的是:Object.a…

深度学习---模型预热(Model Warm-Up)

一、基本概念与核心定义 模型预热是指在机器学习模型正式训练或推理前,通过特定技术手段使模型参数、计算图或运行环境提前进入稳定状态的过程。其本质是通过预处理操作降低初始阶段的不稳定性,从而提升后续任务的效率、精度或性能。 核心目标&#xf…

加载渲染geojson数据

本节我们学习如何在cesium中加载geojson数据 想要加载geojson数据首先要有数据源,我们以中国地图为例 复制数据的geo api 在cesium的官网库中查询 可以看到如何在cesium中导入数据的方法 //加载geojson数据let dataGeo Cesium.GeoJsonDataSource.load("https://geo.dat…

python:pymysql概念、基本操作和注入问题讲解

python:pymysql分享目录 一、概念二、数据准备三、安装pymysql四、pymysql使用(一)使用步骤(二)查询操作(三)增(四)改(五)删 五、关于pymysql注入…

职坐标AIoT技能培训课程实战解析

职坐标AIoT技能培训课程以人工智能与物联网技术深度融合为核心,构建了“理论实战行业应用”三位一体的教学体系。课程体系覆盖Python编程基础、传感器数据采集、边缘计算开发、云端服务部署及智能硬件开发全链路,通过分层递进的知识模块帮助学员建立系统…

MySQL 用户权限管理:从入门到精通

在当今数据驱动的时代,数据库安全已成为企业信息安全体系的核心组成部分。作为最流行的开源关系型数据库之一,MySQL 的用户权限管理系统提供了强大而灵活的访问控制机制。本文将全面解析 MySQL 用户权限管理的各个方面,帮助数据库管理员和开发…

Java常见API文档(下)

格式化的时间形式的常用模式对应关系如下: 空参构造创造simdateformate对象,默认格式 练习.按照指定格式展示 package kl002;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class Date3 {publi…

博图1200硬件组态与启保停程序编写步骤详解

一、前言 在工业自动化控制领域,西门子S7-1200 PLC因其性能稳定、编程灵活而广受欢迎。本文将详细介绍使用TIA Portal(博图)软件进行S7-1200 PLC硬件组态以及编写基本启保停程序的完整步骤,帮助初学者快速掌握这一基础而重要的技…

AutoMouser - 单次AI调用铸就高效自动化脚本

你是否厌倦了反复点点点的枯燥操作?是否希望像科幻电影那样,一句指令,万事搞定?如果告诉你,现在只需要一次AI调用,就能自动执行一整套鼠标脚本操作,你会不会觉得:自动化的时代&#…

双周报Vol.72:字段级文档注释支持、视图类型现为值类型,减少内存分配

双周报Vol.72:字段级文档注释支持、视图类型现为值类型,减少内存分配 更新目录 ..调用链末尾自动丢弃值语义变更字段级文档注释支持视图类型现为值类型,减少内存分配特效函数调用现支持样式高亮实验性支持虚拟包,接口与实现解耦 …

OceanBase 开发者大会:详解 Data × AI 战略,数据库一体化架构再升级

OceanBase 2025 开发者大会与5月17日在广州举行。这是继 4 月底 OceanBase CEO 杨冰宣布公司全面进入AI 时代后的首场技术盛会。会上,OceanBase CTO 杨传辉系统性地阐述了公司的 DataAI 战略,并发布了三大产品:PowerRAG、共享存储&#xff0c…

大小端模式和消息的加密解密

大小端模式 知识点一 什么是大小端模式 // 大端模式 // 是指数据的高字节保存在内存的低地址中 // 而数据的低字节保存在内存的高地址中 // 这样的存储模式有点儿类似于把数据当作字符串顺序处理 // 地址由小向大增加,数据从高位往低位放 …

WebRTC技术EasyRTC嵌入式音视频通信SDK助力智能电视搭建沉浸式实时音视频交互

一、方案概述​ EasyRTC是一款基于WebRTC技术的开源实时音视频通信解决方案,具备低延迟、高画质、跨平台等优势。将EasyRTC功能应用于智能电视,能够为用户带来全新的交互体验,满足智能电视在家庭娱乐、远程教育、远程办公、远程医疗等多种场…

Supermemory:让大模型拥有“长效记忆“

目录 引言:打破大语言模型的记忆瓶颈,迎接AI交互新范式 一、Supermemory 核心技术 1.1 透明代理机制 1.2 智能分段与检索系统 1.3 自动Token管理 二、易用性 三、性能与成本 四、可靠性与兼容性 五、为何选择 Supermemory? 六、对…

2025.5.17总结

周六上了一天的课,从早上9:30至下午6:30,在这个过程中,确实也收获了不少。 1.结识了更多的大佬和不同职业的精英。 一个在某科技公司做开发的主管甘阿碰,当我听到科技公司,还以为是公司里的一…

语音识别——通过PyAudio录入音频

PyAudio 是一个用于处理音频的 Python 库,它提供了录制和播放音频的功能。通过 PyAudio,可以轻松地从麦克风或其他音频输入设备录制音频,并将其保存为文件或进行进一步处理。 安装 PyAudio 在使用 PyAudio 之前,需要先安装它。可…

python打卡day30

模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 python的学习就像…