当指定的进程终止时是否可以使用 NotifyOSD 进行通知?

当指定的进程终止时是否可以使用 NotifyOSD 进行通知?

我必须承认自己是 Firefox 的重度用户,因此当我终止 FF 时,我总是必须在关闭 Ubuntu 之前使用系统监视器检查其进程是否真的终止。否则,由于 Ubuntu 在关闭期间强制终止 FF,我将在下一个会话中看到“恢复会话屏幕”。

因此,我想到监控 FF,当进程终止时向 NotifyOSD 发送命令,通知我 FF 已关闭,可以安全地关闭 Ubuntu。

由于我对 Ubuntu 还很陌生,我不知道如何做到这一点,或者是否可行...有什么建议从哪里开始?

提前致以最诚挚的问候和感谢!Ruessel

附言:我运行的是 Ubuntu 14.04 LTS

答案1

这是可以做到的。可以编写一个包装器脚本,它将启动一个进程并捕获其 PID 并监视该 PID。例如,我编写了一个小脚本,如果像这样调用,它将monitor_process.sh firefox启动 Firefox 并等待它退出。

#!/bin/bash
nohup $@ &> /dev/null &
PID=$!
while ps --no-headers  -p $PID > /dev/null
do
   echo $PID
   : # no-op
   sleep 0.25
done

notify-send "$@ exited"

当然,Firefox 可能有多个实例,因此我们希望有类似的东西monitor_process.sh firefox,它将监视所有的 Firefox 窗口,直到它们全部退出。

#!/bin/bash
SELF=$$
while  pgrep -f firefox | grep -v $SELF > /dev/null
do
   : # no-op
   sleep 0.25
done

notify-send "$@ exited"

我上面所做的方法是获取所有包含“firefox”字符串的进程的 PID,但忽略脚本的 PID(因为monitor_process.sh firefox将包含在列表中,而我们不希望这样 - 如果脚本不断监视自身,它将不会退出)。

当然,脚本一旦发出通知就会退出,如果在退出后重新打开窗口,可能需要重新启动,因此将其添加nohup $@ &> /dev/null &到脚本的第二行并将其用作启动器和监视器可能会更容易。

或者,我们可以添加一个外部 while 循环来监视 Firefox 是否正在运行,并且仅在运行时开始监视;如果没有运行 - 开始监视。

#!/bin/bash

start_monitoring()
{

while  pgrep -f "$@" | grep -v $SELF &> /dev/null
do
   : # no-op
   sleep 0.25
done
notify-send "$@ exited"
}

main()
{
local SELF=$$
while true
do
  pgrep -f "$@" | grep -v $SELF > /dev/null 
  [ $? -eq 0 ] && start_monitoring "$@"
sleep 0.25
done
}
main "$@"

上述代码适用于多个 Firefox 实例以及多次关闭和重新打开,因此您可以在会话期间关闭 Firefox,它会通知您,并继续等待直到出现新的 Firefox,然后开始监视它。

答案2

这对我有用...

bin如果不存在这样的文件夹,则在主目录中创建一个名为的文件夹。

创建一个纯文本文件,~/bin内容如下:

#!/bin/bash
if 
    pgrep firefox
then       
    notify-send  --urgency=critical "Is Firefox still running?"
else 
    notify-send  "No Firefox process is running"
    zenity --question --text="Proceed to shutdown?"
  if [ $? = 0 ]; then
        dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
  else
    exit
  fi
fi

另存为fx-check-n-shutdown。无需任何后缀。

fx-check-n-shutdown然后,在文件管理器中右键单击。选择Properties并让文件对您“可执行”。

libnotify-bin从软件中心安装或sudo apt-get install libnotify-bin在终端中运行。

完成后,fx-check-n-shutdown在终端中输入 并点击enter。你应该看到一个通知询问你“Firefox 还在运行吗?”或“没有 Firefox 进程正在运行”。

在后一种情况下没有 Firefox 进程正在运行,通知很快就会自动消失(前提是您的鼠标指针不在通知所占据的区域上)。

您还会看到一个小窗口询问您是否要关机。

如果 Firefox 仍在运行,您需要通过单击通知来自行关闭通知,然后确保您已彻底关闭 Firefox。

您所做的就是创建一个名为 的脚本fx-check-n-shutdown
您已将其设为可执行文件。
您已安装libnotify-bin一个允许普通用户自行发送通知的程序。

脚本的作用:

  • 它检查是否任何包含“firefox”的进程正在运行。

  • 如果 Firefox 进程正在运行,您将收到通知。然后您可以打开终端,运行pgrep firefox以获取进程的 ID (PID),并使用该 PID 通过运行获取实际运行命令的更多详细信息,cat /proc/<pid>cmdline其中您将使用实际 PID 而不是<pid>

  • 如果没有打开涉及 Firefox 的进程,您将收到简短通知,并打开一个 Zenity 关机窗口询问您是否确实要关机。

满意后,您可以设置键盘快捷键来启动,fx-check-n-shutdown而不必通过终端运行。如何设置快捷方式取决于您的 Ubuntu 版本。对于 Ubuntu 14.04,说明如下:https://help.ubuntu.com/14.04/ubuntu-help/keyboard-shortcuts-set.html

相关内容