Можно ли уведомить с помощью NotifyOSD, когда указанный процесс завершается?

Я должен признать, что являюсь активным пользователем Firefox, поэтому, когда я прекращаю FF, мне всегда приходится проверять с помощью системного монитора, действительно ли его процесс завершается, прежде чем завершать работу Ubuntu. В противном случае я получу «экран восстановления сеанса» на следующем сеансе из-за принудительного завершения Ubuntu FF во время выключения.

Итак, у меня появилась идея отслеживать FF, и когда процесс завершается, чтобы отправить команду в NotifyOSD, чтобы, ну, в общем, уведомить меня, что FF выключен и безопасно завершить работу Ubuntu.

Поскольку я довольно новичок в Ubuntu, я понятия не имею, как это сделать, или даже если это возможно ... Любой совет, с чего начать?

С наилучшими пожеланиями и заранее спасибо! Ruessel

PS: я запускаю Ubuntu 14.04 LTS

4
задан 8 April 2016 в 15:42

2 ответа

Возможно сделать так. Можно было записать сценарий обертки, который будет запускать процесс и получать его 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"

способ, которым я сделал это выше, путем получения PIDs всех процессов, которые содержат строку "Firefox" в них, но игнорирование PID сценария (потому что monitor_process.sh firefox будет включен в список, и мы не хотим это - выход привычки сценария, если это постоянно контролирует себя).

, Конечно, сценарий выйдет, после того как он отсылает уведомление и, возможно, должен перезапустить при повторном открытии окна после того, как он выходит, таким образом, вероятно, было бы легче также добавить nohup $@ &> /dev/null & к второй строке в сценарии и использовать его и в качестве средства запуска и в качестве монитора.

, С другой стороны, мы могли добавить внешний цикл с условием продолжения, который будет контролировать, если 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 во время сессии, это уведомит Вас и продолжит ожидать, пока новый не обнаруживается и начнет контролировать это.

0
ответ дан 9 April 2016 в 01:42
  • 1
    Должен был быть false действительно. Кроме того, проверьте сообщения о состоянии в консоль ST, они могли бы быть полезными для нахождения причины. – idleberg 19 August 2017 в 03:16

Это работает на меня...

Создайте названную папку 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 получить идентификатор процесса (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

1
ответ дан 9 April 2016 в 01:42
  • 1
    Потрясающий ответ, это было очень поучительно. Большое спасибо! Символ, который я хочу, является персонализированным логотипом, таким образом, это, скорее всего, doesn' t существуют в других общедоступных шрифтах. Я мог добавить изображение действительно, но это будет довольно громоздким для задачи, для которой я нуждаюсь в пользовательском символе. I' m кодирование панели подписи для графика с помощью Python' s matplotlib, и я не хочу переполнять код. Добавление текстового отрывка было бы намного более изящным. Так или иначе Ваш комментарий был очень полезен. I' m думающий теперь, будет ли matplotlib в состоянии декодировать символ, который я делаю (если я сделал один). Что действительно думает? – Alexandru Mircea 24 August 2017 в 03:23

Другие вопросы по тегам:

Похожие вопросы: