使用 systemd 抑制剂

使用 systemd 抑制剂

此时我的笔记本电脑开始出现我认为的硬件问题。有时我必须尝试 3 次才能成功启动。我试图将修改的代码保存在 USB 记忆棒中,但有时我会忘记。这就是为什么我想知道是否有办法在用户想要关闭计算机时运行脚本。此脚本将检查几项内容,并根据情况取消关机并要求用户执行某些操作(例如插入 USB 密钥),或执行一些语句(如果存在 USB,则保存到 USB)并允许关机。由于需要与用户进行这种交互,仅将脚本放在 /etc/rc0.d 下是不够的。

谢谢

答案1

使用 systemd 抑制剂

原始帖子在下面的部分中详细介绍了如何拦截/sbin/shutdown命令。本节基于systemd 抑制剂

系统抑制剂

姓名

systemd-inhibit — 使用禁止锁执行程序

概要

systemd-inhibit [OPTIONS...] [COMMAND] [ARGUMENTS...]

systemd-inhibit [OPTIONS...] --list

描述

systemd-抑制可用于执行已获取关机、睡眠或空闲抑制锁的程序。在执行指定命令行之前将获取锁,之后将释放锁。

抑制锁可用于阻止或延迟用户的系统休眠和关机请求,以及操作系统的自动空闲处理。这有助于避免在刻录光盘或执行不应中断的类似操作时系统挂起。

更多信息请参阅抑制锁开发者文档

选项

可以理解以下选项:

--what=

  • 采用冒号分隔的一个或多个要禁止的操作列表:“shutdown”、“sleep”、“idle”、“handle-power-key”、“handle-suspend-key”、“handle-hibernate-key”、“handle-lid-switch”,分别用于禁止重启/关机/停机/kexec、挂起/休眠、自动空闲检测或电源/睡眠键和盖子开关的低级处理。如果省略,则默认为“idle:sleep:shutdown”。

--who=

  • 为获取锁定的程序提供一个简短、人性化且易于理解的描述字符串。如果未传递,则默认为命令行字符串。

--why=

  • 采用简短、人性化且易于理解的描述性字符串来说明锁定的原因。默认为“原因不明”。

--mode=

  • 可以采用“block”或“delay”来描述锁的应用方式。如果使用“block”(默认),锁将无时间限制地禁止任何请求的操作,并且只有特权用户可以覆盖它。如果使用“delay”,锁只能在有限的时间内延迟请求的操作。如果时间过去了,锁将被忽略并执行操作。时间限制可以在logind.conf(5)。注意“延迟”仅适用于“睡眠”和“关机”。

--list

  • 列出所有活动的抑制锁而不是获取一个。

-h--help

  • 打印简短的帮助文本并退出。

--version

  • 打印简短的版本字符串并退出。

退出状态

返回已执行程序的退出状态。

例子

# systemd-inhibit wodim foobar.iso

这将使用 wodim(1) 将 ISO 映像 foobar.iso 刻录到 CD 上注意:systemd 文档中的链接已损坏,并在执行此操作时抑制系统睡眠、关机和空闲。

也可以看看

systemd(1)logind.conf(5)


原始帖子

从概念上看,这似乎相当简单。只需找到该命令,重命名,然后将其替换为调用重命名版本的脚本:

$ type -a shutdown
shutdown is /sbin/shutdown
$ sudo mv /sbin/shutdown /sbin/shutdownoriginal

然后编辑您自己的脚本,/sbin/shutdown至少包含以下内容:

#!/bin/bash
/sbin/shutdownoriginal

然后将你的脚本标记为每个人都可以执行:

$ sudo chmod a+x /sbin/shutdown

瞧!现在调用关机的所有内容都会调用您的脚本,然后脚本会调用原始命令。

事实上,当你的脚本被调用时,事情可能并没有达到你期望的状态。例如,我输入了一些命令来记录关机,但它们似乎不起作用:

echo "/sbin/shutdown custom script calling /sbin/shutdownoriginal"
shutdowntime=`date`
echo "Last shutdown: $shutdowntime" >> /home/rick/shutdownlog.txt

第一个echo应该出现,/var/log/syslog但是它没有出现。第二个echo应该在日志文件中附加一行,但是它没有出现。这告诉我,在/sbin/shutdown执行命令时,系统日志记录已关闭,文件 I/O 系统也已关闭。

更好的方法是查看 systemd 关闭目标和/或输入抑制器。不过,我会把这个答案留在这里,以便其他可能认为它可以/会/应该起作用的人知道。

永远记住年龄变化率--我们的里程哎呀艾瑞。

答案2

我在看systemd-抑制

我的理解是,当你在命令前使用它时,它会等到你的命令/脚本完成后再关闭系统,有一些选项可以阻止关机,但对我来说似乎不太明显。目前,你的第一个建议对我有用(我不介意输入“shutdown”而不是图形界面)。下面是一个基本脚本作为示例:

#!/bin/bash

if [ ! -d /media/myusername/myusbname ]; then
  zenity --question --text "Are you sure you want to shutdown without saving? If not choose \"No\" and insert the usb key" 2> /dev/null
  answer=$?
else
  #save data
  answer=0
fi
if [ $answer -eq 0 ]; then
  /sbin/shutdownoriginal
else
  zenity --info --text="Shutdown canceled" 2> /dev/null
fi

谢谢

相关内容