这里有很多解决方案可以在关机/重新启动时执行脚本,但我希望我的脚本仅在关机时执行。
我尝试将脚本放入 /usr/lib/systemd/systemd-shutdown 中,并检查 $1 参数,如图所示这里,但它不起作用。
有任何想法吗 ?
系统:带有 gnome-shell 的 archlinux
$systemctl --version
systemd 229
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
答案1
我终于找到了如何做到这一点。
这是一个有点老套的想法,但它确实有效。
和这个线程: 如何在关机前使用 systemd 运行脚本?
我创建了这个服务/etc/systemd/system/shutdown_screen.service
[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
它将在关机/重新启动/停止/任何情况下执行。 (不要忘记启用它)
在我的脚本中/usr/local/bin/shutdown_screen
我添加了以下内容:
#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1
这将向我的 arduino 发送一条关闭消息,后者将关闭我的屏幕。
答案2
根据systemd.special
手册页,您应该使用Before=poweroff.target
.
断电目标
A special target unit for shutting down and powering off the system. Applications wanting to power off the system should start this unit. runlevel0.target is an alias for this target unit, for compatibility with SysV.
此外,正如我在评论中提到的,您应该将自定义脚本放入/etc/systemd/system/
.该/usr/lib/systemd/system/
目录旨在用于系统提供的脚本。
所以,也许是这样的:
[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes
答案3
从阅读这里的答案来看,似乎对 systemd 的工作原理有很多误解。首先不要利用冲突来排除目标。应避免同时运行冲突的服务。
如果一个单元在另一个单元上有 Conflicts= 设置,则启动前者将停止后者,反之亦然。
单位是指启动特定服务的 .service 文件,而不是要达到的目标。换句话说,Conflicts=reboot.target
充其量是毫无意义的,最坏的情况是它会阻止您重新启动。不要这样做。这并不意味着重新启动时不要运行它。这意味着根据时间以及 systemd 如何解释这种错误使用冲突来中止此服务或reboot.target。
以下是当前设置单元(也称为 .service 文件)的示例,该单元仅在关机时运行而不是重新启动时运行:
[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target
[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=poweroff.target halt.target
poweroff.target 相当于旧的 systemv 运行级别 0,仅在关闭时达到。 halt.target 是 systemd 使用的备用关闭路径,也无法通过重新启动来访问。 install 部分告诉 systemd 将此服务添加到必须在之前完成poweroff.target
或halt.target
将被视为已达到的列表中。
该服务已安装并在我的系统上运行。
答案4
我已经测试了这里和各个网站上的大部分帖子。唯一真正只在重新启动时运行(不再启动时运行 - 但实际上在 shutdown-halt-poweroff 时失败)的是 @benoit2600 的帖子。他的第二个/解决方案帖子
但经过测试,我发现您可以在单元中使用所有 4 个目标,并且仅在其中之一实际使用时运行。根据他和您的需要休息在“ExecStop = mycommand”中,我刚刚输入了我的直接命令(因为我不需要完整的bash)
[Unit]
Conflicts=reboot.target poweroff.target halt.target shutdown.target