Вопрос или проблема
У меня есть bash-скрипт, который открывает окно с помощью notify-send
. Я хотел бы закрыть это окно, когда скрипт завершится, но не могу найти ничего, что нужно kill
.
Этот вопрос является дубликатом https://askubuntu.com/questions/639754/is-it-possible-to-cancel-or-clear-a-notification-created-by-using-notify-send , но ни один из ответов мне не подходит. В принятом ответе говорится, что нужно убить процесс под названием notify-osd
, но у меня нет ничего такого. Примечательно, что этот вопрос был задан десять лет назад.
Мой скрипт выглядит так:
notify-send -u critical -i ~/.icons/my-icon.png "$titletext" "$helptext"
helppid=$!
…
kill $helppid
(Настройка срочности критична, чтобы окно Помощи оставалось открытым, пока его явно не закроют.)
Проблема в том, что $!
не возвращает значение. ps -ef | grep -i notify
ничего не показывает, связанного с моим скриптом.
Я нашел обходной путь, используя функцию print-id
в notify-send
(описанную в https://askubuntu.com/a/161852 ):
print-id=$(notify-send -p -u critical -i ~/.icons/my-icon.png "$titletext" "$helptext")
notify-send -r $print-id -u low ~/.icons/my-icon.png "$titletext" Finished
Может ли кто-нибудь описать лучший способ закрыть диалоговое окно помощи? Я прочитал рекомендации по yad
и рассматриваю возможность установить и оценить его.
Ваш обходной путь звучит как идеальное решение. Как это часто бывает,
archlinux
предоставляет больше информации о том, как работают уведомления; сейчас они обычно
реализуются на рабочем столе с помощью dbus
.
dbus
— это фоновый сервис, который позволяет инструментам заявлять, что они готовы
предоставить какую-либо функцию под известным именем, таким как
“org.freedesktop.Notifications” для всплывающих уведомлений. Когда приложение,
например, notify-send
, хочет показать уведомление, оно отправляет сообщение через
dbus на известное имя функции, и слушающий инструмент выполняет
ожидаемое действие, отправляя обратно id уведомления для последующего использования.
Вот почему notify-send
может завершиться почти мгновенно, и вы не видите
нового запущенного процесса; обычно инструмент, предоставляющий функцию, имеет тенденцию
работать всё время как демон или как часть какого-то большего кода на рабочем столе.
dbus
также может быть настроен для запуска инструмента “по требованию”, если он не
уже слушает сообщения.
Таким образом, самый чистый способ снять уведомление — это использовать тот же
API и использовать notify-send
для обновления предыдущего уведомления с новым
статусом. Это не требует от вас знания того, какой инструмент предоставляет всплывающее окно, если таковой имеется,
поэтому это наиболее перспективный подход.
Ответ или решение
Как программист в сфере ИТ, вы сталкиваетесь с проблемой управления уведомлениями, созданными с помощью инструмента notify-send
в базовой оболочке. Возникает вопрос о том, как программно завершить уведомление или окно, сформированное этой утилитой, особенно когда процесс, связанный с уведомлением, не появляется в списке активных процессов. Исследуем эту задачу и определим оптимальное решение.
Проблема
Вы создаете критическое уведомление с помощью bash-скрипта и хотите завершить его после выполнения скрипта. Однако notify-send
не запускает отдельный процесс, что делает невозможным использование простого kill
для его завершения. Стандартный подход с использованием kill $!
здесь не срабатывает.
Решение
Ваш обходной путь с использованием функции print-id
в notify-send
— хороший подход. Он включает:
-
Создание уведомления с опцией
-p
для получения ID уведомления:print-id=$(notify-send -p -u critical -i ~/.icons/my-icon.png "$titletext" "$helptext")
-
Использование этого ID для обновления или отмены существующего уведомления:
notify-send -r $print-id -u low ~/.icons/my-icon.png "$titletext" "Finished"
Объяснение
Система нотификаций теперь чаще всего реализуется через D-Bus. Это фоновый сервис, который позволяет приложениям взаимодействовать друг с другом. notify-send
через D-Bus отправляет сообщение на адрес "org.freedesktop.Notifications". Инструмент, обеспечивающий работу этой функции, прослушивает такие сообщения и генерирует уведомления, возвращая ID уведомления для дальнейшего использования.
Таким образом, лучшее решение — использовать тот же API для обновления или отмены уведомления. Это делает ваш скрипт более устойчивым к изменениям в ПО, обеспечивающем работу нотификаций, и избавляет от необходимости знать, какой именно инструмент создает всплывающие окна.
Альтернативы
Можно рассмотреть использование других инструментов, например, yad
, который предоставляет более гибкие возможности для работы с уведомлениями и диалоговыми окнами.
Заключение
Использование print-id
в notify-send
и последующее обновление уведомления через D-Bus — наиболее эффективный способ отмены уведомления. Это решение соответствует современным подходам и обеспечивает надежное взаимодействие с системой уведомлений.
Для дальнейшего изучения возможностей D-Bus вы можете обратиться к документации по Arch Linux, что даст более глубокое понимание внутренней архитектуры работы уведомлений в современных окружениях рабочего стола.