我在 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
现在可以了。
我怎样才能让它立即按预期工作?
就像注意到该部分中没有
WantedBy
设置一样简单。您已经告诉 systemd 启用该服务,但实际上并没有描述启用时哪个目标应该需要它。将此作为日常练习是不明智的。
echo
让标准输出被记录下来,直到它成为一个实际的问题(在一些命令的情况下显然远非如此)。并且,类似地,不要命名 Bourne Again shell,除非您明确依赖 Bashisms,而 Bashisms(同样)您不只是使用一些
echo
命令。十年前,Debian 和 Ubuntu 的人们竭尽全力将 Bourne Again shell 尽可能地从系统引导过程中移除,并用 Almquist shell 代替它,后者在非交互模式下的初始化开销要小得多,这显着加快了引导速度。无所事事
/bin/bash
地到处使用——在 systemd 服务单元中同样如此!— 而不是/bin/sh
, 撤消了那项出色的工作。