我在 Raspbian Stretch 上有一个 Raspberry Pi,我想在启动时启用一些 GPIO 引脚。
我写了以下服务:
[Unit]
Description=GPIO23 exported as output, value off
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo "23" > /sys/class/gpio/export'
ExecStart=/bin/bash -c 'echo "out" > /sys/class/gpio/gpio23/direction'
ExecStart=/bin/bash -c 'echo "0" > /sys/class/gpio/gpio23/value'
StandardOutput=null
[Install]
Alias=gpio23.service
通过SSH登录后,我检查结果:
pi@Hi-Fi:~ $ systemctl status gpio23
● gpio23.service - GPIO23 exported as output, value off
Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled)
Active: inactive (dead)
pi@Hi-Fi:ls /sys/class/gpio/
export gpiochip0 unexport
由于它尚未运行(或者未按预期工作),我手动启动该服务:
pi@Hi-Fi:~ $ sudo systemctl start gpio23
[sudo] password for pi:
pi@Hi-Fi:~ $ systemctl status gpio23
● gpio23.service - GPIO23 exported as output, value off
Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled)
Active: inactive (dead)
Jan 01 19:31:12 Hi-Fi systemd[1]: Starting GPIO23 exported as output, value off...
Jan 01 19:31:12 Hi-Fi systemd[1]: Started GPIO23 exported as output, value off.
pi@Hi-Fi:~ $ ls /sys/class/gpio/
export gpio23 gpiochip0 unexport
现在可以了。
我怎样才能让它立即按预期工作?
答案1
[安装] 别名=gpio23.service
WantedBy
就像注意到该部分中没有设置一样简单。您已告诉 systemd 启用该服务,但实际上并未描述启用该服务时哪个目标应该需要该服务。
标准输出=空
将其作为日常实践是不明智的。让标准输出被记录下来,直到它成为一个实际问题为止(这显然远不是几个echo
命令的情况)。
ExecStart=/bin/bash ...
并且,类似地,不要命名 Bourne Again shell,除非您明确依赖 Bashism,而您(再次)不只是使用某些echo
命令。
十年前,Debian 和 Ubuntu 的人们竭尽全力将 Bourne Again shell 从系统引导进程中剔除,并用 Almquist shell 代替,后者在非交互模式下的初始化开销要少得多,这使得显着加快了引导速度。随处闲置地使用/bin/bash
——同样在 systemd 服务单元中! — 而不是/bin/sh
,会毁掉这项良好的工作。