为什么 systemd 脚本在启动时没有产生预期的结果,但之后却正确产生?

为什么 systemd 脚本在启动时没有产生预期的结果,但之后却正确产生?

我在 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,会毁掉这项良好的工作。

相关内容