如何在 xserver 关闭之前运行交互式脚本?

如何在 xserver 关闭之前运行交互式脚本?

每次我关闭或重启笔记本电脑(Ubuntu 14.04)时,我都想运行一个脚本来检查我是否将最新代码推送到了远程 git 存储库。如果我忘记了,那么它会打开一个终端,要求用户输入提交消息并推送更改。我已经让脚本运行了。

现在我正在寻找一种方法,使该脚本在我关机或重启时但在 GUI 退出之前自动运行。

到目前为止,我的方法是使用 System V Init(是的,我知道它有点过时):

我将带有 LSB 标头的初始化脚本复制到 /etc/init.d:

sudo cp ~/git_checker /etc/init.d/

,更改权限:

sudo chmod a+x /etc/init.d/git_checker

并配置执行场景:

sudo update-rc.d /etc/init.d/git_checker defaults

当我用测试此脚本时sudo service git_checker start,出现错误:“无法解析参数:无法打开显示:”

通过阅读,我发现,不应该使用 init 脚本来打开终端(像这样:) su user -c 'x-terminal-emulator -e /home/user/git_check.sh' ,因为不能保证在执行 init 脚本时 X 服务器正在运行。

因此,init 脚本似乎是错误的方法。还有其他方法吗?也许使用 upstart 或 systemd?

如果要在系统启动时运行脚本,我可以简单地将其放在启动应用程序中。是否存在类似的东西,例如关机应用程序?

答案1

我创建了一个小监控脚本不久前,一旦脚本检测到用户试图关闭计算机,它就会调用一个中断函数。针对您的具体情况,需要进行的小修改是取消关机操作,运行脚本,然后调用关机。

#!/bin/bash

main()
{
  dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
  while read -r line;
  do
#   echo $line
     grep -q '.*NameAcquired.*' <<< "$line"  && continue  #  Ignore that first line
    if [ -n "$line"  ];then
       interrupt 
    fi
  done
}

interrupt()
{ 
  # The first command will close the shutdown dialog
  qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
  # place call to your script bellow this comment
  zenity --info --text='Remember to push changes to git repo'
  # Uncomment line bellow for shutdown
  # qdbus com.canonical.Unity  /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown

}

main

当然,这个脚本必须作为启动应用程序的一部分添加,或者你可以为其手动创建 .desktop 文件

笔记:此脚本仅适用于 GUI,因此如果用户发出命令sudo shutdown -P now,它将不起作用。您还需要shutdown使用另一个脚本来监视命令pgrep shutdown或将另一个功能集成到脚本中。

例如,在上面的脚本中,您需要添加此功能

manual_shutdown_monitor()
{
  while true 
  do
  if pgrep shutdown > /dev/null
  then
      zenity --info --text="GOT MANUAL"
  fi
  sleep 0.25
  done
}

然后main()像这样调用该函数

manual_shutdown_monitor &

相关内容