在关闭之前给脚本足够的时间来完成

在关闭之前给脚本足够的时间来完成

我构建了一个带有电子墨水屏幕的基于 Linux 的小型设备。如果我能在计算机关闭之前将其清空,似乎可以延长屏幕的使用寿命。 (即使没有电源,EInk 也会被动地继续显示图像,但如果图像始终相同,最终图像可能会烧毁。)但是,在我的廉价显示器上,消隐屏幕需要相当长的时间 - 大约 30 秒。

我已将关闭脚本放入 /etc/rc0.d/K01foobar 中,但它似乎没有运行。我尝试在脚本顶部添加一些代码以写入日志文件,但日志文件永远不会被写入。该脚本是全局可执行的,并且顶部有#!/bin/sh。

知道这里发生了什么吗?我使用了错误的运行级别吗?脚本是否在有时间完成运行之前就被杀死了?它是否无法访问文件系统以写入日志文件,因为那时文件系统已经关闭?

答案1

我发现这篇博文,它很好地对比了 SysV 和 systemd 上的工作方式,并解释了如何处理文件系统变为只读以及您想要运行的命令可能需要很长时间等问题。以下脚本基本上是他为 systemd 提供的脚本,稍加修改。

布朗尼_shutdown.sh:

#!/bin/bash
# see https://fitzcarraldoblog.wordpress.com/2018/01/13/running-a-shell-script-at-shutdown-only-not-at-reboot-a-comparison-between-openrc-and-systemd/
REBOOT=$( systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "rebooting" || echo "not_rebooting" )
if [ $REBOOT = "not_rebooting" ]; then
  /usr/bin/python /home/pi/Documents/programming/brownie/brownie_blank.py
fi

布朗尼_关闭.服务:

# see https://fitzcarraldoblog.wordpress.com/2018/01/13/running-a-shell-script-at-shutdown-only-not-at-reboot-a-comparison-between-openrc-and-systemd/
[Unit]
Description=Blank out the eInk screen before shutting down
DefaultDependencies=no
Before=shutdown.target halt.target
# The following is required because my scripts are in /home:
RequiresMountsFor=/home

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/brownie_shutdown.sh

[Install]
WantedBy=halt.target shutdown.target

生成文件:

configure_shutdown:
    cp brownie_shutdown.sh /usr/local/sbin/brownie_shutdown.sh
    chmod +x /usr/local/sbin/brownie_shutdown.sh
    cp brownie_shutdown.service /etc/systemd/system/brownie_shutdown.service
    systemctl enable brownie_shutdown.service

在bash脚本中,最上面的代码是区分开机和关机的。在 .service 文件中,存在 RequiresMountsFor=/home 行,因为我的脚本位于 /home 中。 ExecStart 行指向 bash 脚本。 makefile 应该以 root 身份执行。

博客文章说你必须重新启动才能使这些更改生效,但我实际上发现当我关闭系统时它们立即起作用。他谈到了该操作可能需要很长时间的问题,这适用于我,并说他在网上找到的其他解决方案不允许他的任务运行完成。但是,他没有解释他的代码的哪些功能可以使其正常工作。

相关内容