当您关闭时,您会看到“您确定...”对话框。有时候,我想给自己发送一个提醒,例如,进行通宵工作而不是关机。然后我需要显示另一个对话框 - 在“您确定吗”之前或旁边。(或者任何其他明显的提醒都可以,比如更改“你确定吗”框的颜色,但这可能涉及对 Linux 模块的内部进行修改,我不想尝试。)我无法获得新的 .service文件按其他地方所述工作。由于我在关机时可能无法访问屏幕,因此我尝试将“touch /home/myuser/i_ran”添加到我的预关机脚本中。我还尝试将其添加到 atd 的 init.d 脚本的 stop 子句中。也不做任何事。什么会起作用?理想情况下它应该以我当前的用户身份运行,或者如果作为 root,我的脚本可以 su 到我当前的用户。我在对话框中使用通知发送,并运行 Ubuntu 20.04(经典的 Gnome)。
前言
这个答案并不是对您的问题的直接解决方案,而是一个重要的方法论讨论,应该指导您以及其他试图在正确方向上提供帮助的社区成员,并希望节省时间和精力。
讨论
您需要首先保持/阻止关闭,这可以通过多种方式完成...一种简单的方法是免费桌面
systemd-inhibit
提供的内置功能,可以简单地从终端或脚本使用...然后您需要显示一个带有特定消息的对话框窗口,这并不像上面(第一个要求)那么简单,因为它需要一个正在运行的显示服务器和一个正在运行的用户图形 gnome 会话...但是,通过外部方法(独立的)这是不可能的)到 gnome-shell,因为当系统收到有关“关闭”的通知时,用户的 gnome 会话将已经终止,并带走了任何可能的用户 GUI 交互的机会......因此,您的两个选择,据我所知,有:gedit
(文本编辑器"There are unsaved documents"
),其中消息将显示在gnome 关闭确认对话框,这就是您自己的应用程序中的消息所在的位置...但是,要使其工作,您的应用程序进程需要在 gnome 用户会话中尝试关闭系统时运行。下面是一个非常简单的 Python 脚本示例(使用Gnome Core Apps中的计算器作为虚拟应用程序),它仅能完成此操作:解决方法
解决方法是替代的非本机解决方案,可以采用例如关闭脚本的形式,如下所示:
...然后,您需要使用该脚本而不是正常的关闭 GUI 按钮...您可能想要禁用默认按钮或将其链接到此脚本(您可能需要找到/编写一个链接部分的扩展)以实现某种本机功能外观。
其他解决方法可能是:
Gnome 会议讨论
虽然,Gnome 中发生的事情仍然保留在 Gnome 中,即它有自己的方法与其余进程分开(我的意思是 Gnome 内部),但您可以使用正确的工具来观察它是如何工作的并尝试与它交互......如果您在终端中运行
dbus-monitor
,保持其运行并尝试关闭/注销,然后只需单击关闭对话框上的取消按钮,然后您会注意到正在调用方法并在不同地址上发出信号,特别是其中CanShutdown
包含正在检查是否允许用户实际关闭机器,您可以通过以下方式拦截:...运行它并保持其运行,然后尝试注销...然而,这还为时过早。
您会注意到的另一个调用是对话框打开调用,它应该具有类似于 和 的内容,
EndSessionDialog
其中Open
第Canceled
一个是方法,第二个是信号...您可以监视对话框,关闭它并发送信号像这样(请注意,无论您采取什么措施来防止它,您的系统都将注销/关闭):...如果您尝试这样做,您会注意到它会在 3 秒后关闭对话框,甚至发送信号
Canceled
,但您的会话在 60 秒后注销。那是因为 Gnome 在后台设置了一个计数器,您需要找到并找到一种方法来禁用它……是的,我知道您的想法:-)……无论如何,您明白了。Raffa 写了一个很长的答案,其中包含大量的技术细节,对于任何想要创建与 Gnome 一致的优雅解决方案的人来说,这应该是无价的。我没有 Linux 和 Gnome 系统知识来做到这一点,但我创建了一种类似于 Raffa 答案中的实用解决方法。我将此解决方法放在下面作为已接受的答案,但强烈建议您阅读 Raffa 的答案以获取技术背景(如果您可以使用它来制定更好的解决方案)。
解决方法
适用于:Ubuntu 20.04/Gnome flashback metacity 和许多其他/旧版本。
目的
能够在关闭开始之前运行脚本或可执行文件,允许您运行或取消它。例如,您可能想要显示运行夜间作业的提醒。
问题
通过屏幕右上角的开/齿轮图标访问系统菜单,其中包含“关机...”菜单选项。它不使用 .desktop 文件,这将允许轻松更改要运行的命令。它忽略GTK 禁止,应用程序设置警告未保存的更改或正在进行的操作。
解决方法
新的 shutdown 有一个调用 shell 脚本的 .desktop 文件。这可以执行您想要的任何操作,例如显示信息框或运行快速命令。此后,脚本运行一个关闭命令,该命令与系统菜单命令不同,它观察 GTK 抑制并提供关闭或取消的选项。
显示的解决方法适用于关闭,但可适用于重新启动、挂起和注销操作。
测试特定的关闭选项或命令是否忽略 GTK 禁止
运行 Gnome 文本编辑器 gedit 并在新文件中输入一些文本而不保存。这会引发 GTK 抑制。确保您没有任何真正未保存的更改或不应中断的进程,然后运行关机。如果观察到 GTK 禁止,关闭将显示“某些进程仍在运行”对话框,列出所有引发禁止的应用程序,并附有文本原因,允许您继续或取消。如果没有,它将直接运行而不会发出任何警告。
实施解决方法的步骤
从右上角的系统菜单中删除“关机”条目
gsettings set com.canonical.indicator.session suppress-shutdown-menuitem true
将其替换为新的应用程序 这将是一个 shell 脚本,可以执行您想要执行的任何操作。当操作完成或用户关闭信息框时,它应该返回,然后脚本运行关闭命令。
这是在文本文件存在且包含提醒文本时显示提醒的基本方法。将其保存为 ~/.local/bin/shutdown-notify.sh 并运行
chmod +x ~/.local/bin/shutdown-notify.sh
以使其可执行。为新的关机创建桌面文件
将以下代码保存为(例如)~/.local/share/applications/shutdown.desktop
找到一个合适的图标,或创建一个 PNG 格式的 32x32px 图标,然后保存到上面 Icon= 行给出的路径 - 这里 ~/.local/share/icons/shut-down-icon-32.png
打开包含桌面文件的文件夹,然后将文件拖到屏幕顶部的菜单栏。光标将变为手形和加号,您可以将其放在左侧或右侧。
此后,系统菜单中将缺少“关机”选项,但更好的选项将在菜单栏上显示为图标。
其他可能的增强功能
替换注销、重新启动或挂起
要替换注销(可能没有必要,因为它确实遵守 GTK 禁止),请运行
gsettings set suppress-logout-menuitem true
要替换注销,重新启动并关闭,请运行gsettings suppress-logout-restart-shutdown true
在 shell 脚本底部运行的命令将是gnome-session-quit --reboot
或者gnome-session-quit --logout
我没有研究如何替换暂停或使用哪个命令。像旧的一样将新的关机添加为系统菜单选项
我还没有尝试这样做。有一些 Gnome 扩展可以更改系统菜单中的选项,但我找不到可以执行此操作或可以配置的扩展。其中可能存在,或者熟悉它们的人可以编写或改编一个。
使用 GTK 禁止来显示警告
如果只想显示警告,桌面文件可以
gnome-session-quit --power-off
直接调用,不需要用户提供的 shell 脚本。这将使关机本身显示一个“某些进程仍在运行”对话框,并带有文本原因。在这种情况下,您必须使用 C 或 Python 创建一个虚拟GTK 应用程序,该应用程序会引发抑制,然后在后台隐形运行。在 C 中,您将包含以下行,例如