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

在 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.xdnf.cn/news/477343.html

相关文章:

  • 炼丹学习笔记3---ubuntu2004部署运行openpcdet记录
  • OrangePi Zero 3学习笔记(Android篇)11 - IR遥控器
  • 现在环保方面有什么新的技术动态
  • Qt/C++编写音视频实时通话程序/画中画/设备热插拔/支持本地摄像头和桌面
  • MySQL 8.0 OCP 1Z0-908 121-130题
  • 蓝牙协议架构与调试工具详解(含 BLE、HCI 命令、调试命令)
  • Prometheus实战教程:k8s平台-Mysql监控案例
  • 记一次缓存填坑省市区级联获取的操作
  • 自学嵌入式 day19-数据结构 链表
  • 【前端】构建关系图谱的前端组件推荐
  • SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
  • 使用哈希表封装myunordered_set和myunordered_map
  • 【Python CGI编程】
  • go-中间件的使用
  • Spring MVC 对 JavaWeb 的优化:从核心组件到注解
  • CentOS系统中升级Python 3.12.2版本
  • 数据通信原理 光纤通信 期末速成
  • 【Umi】项目初始化配置和用户权限
  • Chrome拓展(Chrome Extension)开发定时任务插件
  • 掌握 Kotlin Android 单元测试:MockK 框架深度实践指南
  • npm cross-env工具包介绍(跨平台环境变量设置工具)
  • A2A vs MCP vs AG-UI
  • 在微创手术中使用Kinova轻型机械臂进行多视图图像采集和3D重建
  • CSS实现文本自动平衡text-wrap: balance
  • 容器化-k8s-使用和部署
  • 能源数字化转型关键引擎:Profinet转Modbus TCP网关驱动设备协同升级
  • 从XSS到“RCE“的PC端利用链构建
  • 消防应急处置管理的全流程概述
  • 软件架构风格系列(3):管道 - 过滤器架构
  • 顶层架构 - 消息集群推送方案