![为什么 systemd 脚本在启动时没有产生预期的结果,但之后却正确产生?](https://linux22.com/image/124755/%E4%B8%BA%E4%BB%80%E4%B9%88%20systemd%20%E8%84%9A%E6%9C%AC%E5%9C%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E6%B2%A1%E6%9C%89%E4%BA%A7%E7%94%9F%E9%A2%84%E6%9C%9F%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%8C%E4%BD%86%E4%B9%8B%E5%90%8E%E5%8D%B4%E6%AD%A3%E7%A1%AE%E4%BA%A7%E7%94%9F%EF%BC%9F.png)
我在 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
,会毁掉这项良好的工作。