在 Raspberry PI(运行 raspbian)上,我需要运行脚本关闭/关机, 但不重启。
我的第一次尝试是定义如下服务:
[Unit]
Description=Power off service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/usr/local/bin/poweroff.sh
[Install]
WantedBy=multi-user.target
这有效,但脚本在重启时也在运行。因此我尝试将其安装到不同的目标:
[Install]
WantedBy=shutdown.target halt.target
但是经过这样的改变之后,脚本根本无法运行。
定义关机时应执行的操作的正确方法是什么?
答案1
从我在网上收集到的信息来看,最好的选择是Conflicts=reboot.target
在单元文件([Unit]
部分)中,然后在脚本中执行以下操作:
systemctl list-jobs | egrep -q 'reboot.target.*start'
如果reboot.target
计划启动,则重新启动。否则,不会重新启动。如果命令“成功”,则系统正在重新启动。否则,系统正在关闭。您可以像这样使用它:
if ! systemctl list-jobs | egrep -q 'reboot.target.*start'; then
echo Shutting down
fi
答案2
Daniel 的回答解决了问题中的问题。但它仍然不是我真正需要的:脚本调用得太早,我需要它尽可能晚地执行(脚本实际上使用连接到 RPi 引脚的继电器关闭电源GPIO
)
投入更多时间之后,我找到了更简单的解决方案,它完全满足了我的需求:
/etc/systemd/system/systemd-poweroff.service.d
如果目录尚不存在,则创建目录poweroff.conf
在目录中创建一个新文件/etc/systemd/system/systemd-poweroff.service.d
:
[Service]
ExecStartPre=/usr/local/bin/poweroff.sh
采用这种方法,无需添加新服务