从挂起状态唤醒后无法运行基于 systemd 的脚本。为什么?

从挂起状态唤醒后无法运行基于 systemd 的脚本。为什么?

下列回答演示如何基于 systemd 从挂起状态唤醒后运行脚本。我尝试了这些方法,但无法让 gnome-terminal 出现并运行命令。

#!/bin/sh
if [ "$1" == "post" ]; then
  gnome-terminal --command 'compiz --replace &' 

为什么它们不起作用?我使用的是 Ubuntu 16.04.2 内核 4.8.0-45-generic。我很好奇为什么我的基于 systemd 的脚本不起作用。我的命令在打开的 gnome-terminal 上有效,但不知何故无法与 systemd-suspend.service 方法一起使用。???

答案1

正如您所知,任何终端仿真器在完成其工作后都已关闭。

但是如果您希望 gnome-terminal 不被关闭,请使用/etc/pm/sleep.d路径中的这个脚本(这个脚本会导致终端保持打开状态,直到您按下回车键):

sudo nano /etc/pm/sleep.d/myscript

然后将这些内容粘贴到您的脚本中:

#!/bin/bash
case $1 in 
     thaw|resume) gnome-terminal --command 'bash -c "compiz --replace &; read line"'
     ;;
esac

然后通过以下命令使其可执行:

sudo chmod a+x /etc/pm/sleep.d/myscript

我希望这对你有用。

更新:

感谢分享。我很好奇为什么我的基于 systemd 的脚本不起作用。我的命令在打开的 gnome-terminal 上有效,但不知何故无法与 systemd-suspend.service 解决方案一起使用。您可以在您的系统上尝试看看它是否有效果吗?您可以将 compriz 命令替换为命令“sleep 20”进行尝试。感谢您的反馈 挂起方式在许多机器上是不同的,有些机器使用sudo pm-suspend,有些机器使用systemctl suspend命令。

如果要systemctl suspend用于操作系统睡眠,我们可以使用基于 systemd 的脚本(不是使用sudo pm-suspend。但在某些系统中,当您单击挂起按钮时,操作系统会使用pm-suspend命令)。但是基于 systemd 的脚本和基于电源管理的脚本彼此之间有一点区别:

在基于 systemd 的脚本中,我们无法运行 GUI 应用程序,因为在这种情况下没有 X 服务器可供连接。

所以您不能使用gnome-terminal这样的命令gnome-terminal --command 'compiz --replace &'。如果您想显示 gnome-terminal,您必须使用基于电源管理的脚本。

但对于您来说,使用这个脚本就足够了(不需要 gnome-terminal):

#!/bin/sh
if [ $1 = post ] ; then
compiz --replace &
fi

您可以通过替换以下内容来测试您的touch /home/YOURUSERNAME/Desktop/test.txt脚本compiz --replace &

#!/bin/sh
if [ $1 = post ] ; then
touch /home/YOURUSERNAME/Desktop/test.txt
fi

(请注意,由于在基于 systemd 的脚本中,root 用户运行命令,所以不要使用~/Desktop而不是/home/YOURUSERNAME/Desktop因为 root 用户的 ~ 不是您的主目录!)

相关内容