当前位置: 首页 > 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 会一次完成初始化。

相关文章:

  • YOLOv3深度解析:多尺度特征融合与实时检测的里程碑
  • 淘宝扭蛋机系统开发前景分析:解锁电商娱乐化新蓝海
  • 执行apt-get update 报错ModuleNotFoundError: No module named ‘apt_pkg‘的解决方案汇总
  • 文件系统交互实现
  • 特斯拉虚拟电厂:能源互联网时代的分布式革命
  • NX二次开发C#---遍历当前工作部件实体并设置颜色
  • 来一个复古的技术FTP
  • 交叉熵损失函数,KL散度, Focal loss
  • PHP:经典编程语言在新时代的持续活力与演进
  • 中exec()函数因$imagePath参数导致的命令注入漏洞
  • 自定义CString类与MFC CString类接口对比
  • 奥运数据可视化:探索数据讲述奥运故事
  • w~深度学习~合集3
  • PyTorch 的 F.scaled_dot_product_attention 返回Nan
  • 三格电子上新了——Modbus转IEC104网关
  • C42-作业练习
  • 速通RocketMQ配置
  • MySQL——3、数据类型
  • YOLOv8在单目向下多车辆目标检测中的应用
  • VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae
  • 国家统计局公布2024年城镇单位就业人员年平均工资情况
  • 武大校长:人工智能不存在“过度使用”,武大不会缩减文科
  • 在本轮印巴冲突的舆论场上也胜印度一筹,巴基斯坦靠什么?
  • 端午小长假前夜火车票今日开抢,多个技巧提高购票成功率
  • 泽连斯基:乌代表团已启程,谈判可能于今晚或明天举行
  • 中拉互联网发展与合作论坛在西安开幕