AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 767743
Accepted
Enlico
Enlico
Asked: 2024-01-26 03:17:13 +0800 CST2024-01-26 03:17:13 +0800 CST 2024-01-26 03:17:13 +0800 CST

Como funcionam as notificações no Linux?

  • 772

Eu uso o ArchLinux, mas isso deve ser irrelevante, além de ser o motivo pelo qual frequentemente me refiro às suas páginas wiki .

Acho que não tenho uma compreensão muito clara de como as notificações funcionam e quais são os "jogadores" interagindo para que as notificações funcionem:

  • quantos jogadores estão envolvidos?
  • O que é um servidor de notificação e para que serve ?
  • O que é um cliente de notificação e o que ele faz ?
  • O que é isso notify-sendque posso usar para fazer uma notificação aparecer? É o (bem, um ) cliente?
  • O que é um daemon de notificação ?
  • E qual é o papel de libnotify?

Na tentativa de entender isso e configurar notificações em meu sistema, consultei esta página wiki.¹

Eu tentei notification-daemonprimeiro. Isso não funciona apenas após a instalação. Para que uma chamada notify-sendseja bem-sucedida, é necessário iniciá-la (significa executá-la /usr/lib/notification-daemon-1.0/notification-daemon) manualmente, iniciá-la automaticamente de alguma forma ou criar um arquivo /usr/share/dbus-1/services/org.freedesktop.Notifications.servicecom este conteúdo

[D-BUS Service]
Name=org.freedesktop.Notifications
Exec=/usr/lib/notification-daemon-1.0/notification-daemon

Aí eu tentei dunst, mas isso, assim que instalado, simplesmente funciona, no sentido de que notify-sendsimplesmente funciona. Acho que isso ocorre fundamentalmente porque ele se inicia na primeira chamada para notify-send(o que significa que inicialmente tive a impressão de que funcionava também depois de desinstalá-lo; isso porque o dunstprocesso estava em execução), mas como faz isso?

E esses dois notification-daemonestão dunstna seção Servidores de notificação > Standalone , mas também são chamados de "daemons de notificação"; isso significa que o daemon de notificação e o servidor de notificação são sinônimos? Se não, onde está a diferença?

E da perspectiva do usuário (eu), a diferença entre os dois é estética? Quero dizer, quando um está em execução e o outro em execução, vejo que a notificação parece diferente. Aliás, aí vem a pergunta “o que eles estão servindo?”, porque me parece que eles estão apenas esperando que alguma outra ferramenta lhes envie notificações, para que possam mostrá-las de uma forma simpática. Ou ambos estão fazendo as duas coisas? Em ambos os casos, de onde vêm originalmente as notificações? Como eles chegam às caixas de notificação?

De qualquer forma, e se eu quiser fazer coisas personalizadas com as notificações? Digamos que eu queira obter todos eles e ter meu próprio script de shell que, digamos, apenas os anexe em um arquivo ~/notifications. Isso significaria que estou escrevendo meu próprio servidor de notificação? Ou cliente? Ou o que?

Estou perguntando é que quero experimentar a ideia de poder mostrar notificações na xmobarbarra de status (que uso com o gerenciador de janelas XMonad), então estou tentando entender todos os detalhes.

Eu também dei uma olhada no statnotque parece muito magro e sem frescuras, mas com referência ao parágrafo anterior, parece que usar statnotainda significaria que eu ainda teria que escrever uma configuração que, por meio da função update_text, chamasse alguma API que xmobar ou xmonad expõe. Dessa forma eu não teria controle sobre, digamos, quantas notificações desejo mostrar por vez.

Estou ficando um pouco perdido :/

Tentar entender as implicações desta minha questão a partir da especificação de notificações da área de trabalho não teve sucesso: D


(¹) Mas eu tinha um "bug" pré-existente no meu arquivo ~/.xinitrc, então tive que resolvê-lo primeiro .

linux
  • 2 2 respostas
  • 137 Views

2 respostas

  • Voted
  1. Best Answer
    u1686_grawity
    2024-02-19T18:41:15+08:002024-02-19T18:41:15+08:00

    O que é um servidor de notificação e para que serve?

    Na terminologia geral, um servidor é um programa ao qual os clientes se conectam de alguma forma (seja pela rede ou por mecanismos IPC locais). O servidor de notificação é, portanto, um programa que aceita solicitações de "mostrar uma notificação" de clientes e mostra notificações em seu nome.

    O que é um cliente de notificação e o que ele faz?

    Qualquer programa que utilize um servidor de notificação torna-se um "cliente de notificação". Novamente, este não é um termo específico de notificação; trata-se da arquitetura geral.

    O que é esse envio de notificação que posso usar para fazer uma notificação aparecer? É o (bem, um) cliente?

    Sim, é um cliente neste caso. Seu objetivo é principalmente apenas para que você possa fazer notificações aparecerem; os aplicativos não o executam porque podem executar as mesmas operações diretamente em seu próprio processo.

    O que é um daemon de notificação?

    Exatamente a mesma coisa que um servidor de notificação.

    O termo 'daemon' tem um significado um pouco diferente; refere-se a qualquer tipo de serviço em segundo plano , seja um "servidor" ou não - mas neste caso, o programa responsável por mostrar os pop-ups de notificação reais é um servidor e um daemon ao mesmo tempo (pois é executado em background como um daemon e aceita solicitações como um serviço).

    E qual é o papel do libnotify?

    É uma pequena biblioteca que pode ser usada por clientes de notificação, para abstrair as especificidades do mecanismo IPC usado (bem como as diferenças entre as versões do protocolo). Em vez de precisar saber sobre D-Bus e interfaces, o programa simplesmente faz notify_notification_new(...).

    (Dito isto, muitos aplicativos optam por implementar as comunicações diretamente, por exemplo, usando libdbus para fazer as chamadas necessárias – é um protocolo bastante simples, então ambas as opções são provavelmente igualmente comuns.)

    O protocolo usado entre um cliente (como libnotify) e um servidor de notificação também é frequentemente chamado erroneamente de "protocolo libnotify".

    E da perspectiva do usuário (eu), a diferença entre os dois é estética? Quero dizer, quando um está em execução e o outro em execução, vejo que a notificação parece diferente

    Essa é literalmente a diferença. A ideia é que cada ambiente de área de trabalho (GNOME, KDE, etc.) tenha seu próprio servidor de notificação que mostre pop-ups personalizados para aquele ambiente de área de trabalho – aparência, configurações, comportamento, etc.

    (Pode não ser necessariamente um daemon separado; por exemplo, no GNOME e no AwesomeWM, o serviço de notificação é fornecido pelo próprio shell da área de trabalho.)

    Aliás, aí vem a pergunta “o que eles estão servindo?”, porque me parece que eles estão apenas esperando que alguma outra ferramenta lhes envie notificações, para que possam mostrá-las de uma forma simpática.

    Sim, mas "esperar que alguma outra ferramenta envie notificações" é o que conta como "servir" algo. Como resultado, um serviço não precisa necessariamente retornar alguns dados – há muitos serviços em qualquer sistema que são mais ou menos unilaterais, ou seja, cujo trabalho é fazer algo em vez de retornar algo.

    De qualquer forma, e se eu quiser fazer coisas personalizadas com as notificações? Digamos que eu queira obter todos eles e ter meu próprio script de shell que, digamos, apenas os anexe em um arquivo ~/notifications. Isso significaria que estou escrevendo meu próprio servidor de notificação? Ou cliente? Ou o que?

    Você estaria escrevendo seu próprio "servidor de notificação" se ele implementasse o protocolo de notificação, ou seja, o método acordado pelo qual os clientes se comunicam com ele. Para a maioria dos sistemas Linux, o padrão de fato é implementar a interface "org.freedesktop.Notifications" através do D-Bus – se você implementá-la, você terá um servidor de notificação.

    (Embora seja realmente difícil fazer isso através de um script de shell, isso pode ser feito em cerca de 10 linhas de Python ou Perl, visto que a interface consiste em aproximadamente duas funções.)

    Eu tentei primeiro com o daemon de notificação. Isso não funciona apenas após a instalação. Para que uma chamada para notificar-enviar seja bem-sucedida, é necessário iniciá-la (isso significa executar /usr/lib/notification-daemon-1.0/notification-daemon) manualmente, iniciá-la automaticamente de alguma forma ou criar um arquivo em /usr/ compartilhe/dbus-1/services/org.freedesktop.Notifications.service com este conteúdo

    [D-BUS Service]
    Name=org.freedesktop.Notifications
    Exec=/usr/lib/notification-daemon-1.0/notification-daemon
    

    A ausência deste arquivo é deliberada, pois implica que existe apenas um programa fornecendo este serviço específico – enquanto na realidade pode-se ter vários ambientes de desktop instalados, cada um com seu próprio serviço de notificação, e o D-Bus não possui mecanismo para priorizar um. implementação ou outro.

    Portanto, embora muitos outros serviços D-Bus possam ser iniciados automaticamente, a maioria dos servidores de notificação deliberadamente não o são, de modo que não seriam escolhidos para serem iniciados no ambiente de desktop "errado". O ambiente de área de trabalho destina-se a iniciar "manualmente" o serviço apropriado, por exemplo, você pode iniciá-lo a partir do seu computador, ~/.xinitrcse fizer isso.

    Aí tentei o dunst, mas que, assim que instalado, simplesmente funciona, no sentido de que notificar-enviar simplesmente funciona. Acho que isso ocorre fundamentalmente porque ele se inicia na primeira chamada para notificar-enviar (o que significa que inicialmente tive a impressão de que funcionava também depois de desinstalá-lo; isso porque o processo dust estava em execução), mas como funciona? que?

    Ele usa exatamente o mesmo método que você descreveu acima – seu pacote na verdade inclui um arquivo .service D-Bus:

    $ cat /usr/share/dbus-1/services/org.knopwob.dunst.service
    [Serviço D-BUS] Nome=org.freedesktop.Notificações Exec=/usr/bin/dunst SystemdService=dunst.service

    A única diferença é que o arquivo real não recebe o nome do serviço que supostamente fornece (o dbus-daemon não impõe esse requisito para serviços de "usuário").

    Também dei uma olhada no statnot, que parece muito fino e sem frescuras, mas com referência ao parágrafo anterior, parece que usar statnot ainda significaria que eu ainda teria que escrever uma configuração que, por meio da função update_text , chama alguma API que xmobar ou xmonad expõe. Dessa forma eu não teria controle sobre, digamos, quantas notificações desejo mostrar por vez.

    Isso parece ser inevitável. Se você quiser uma lógica customizada, precisará escrever uma lógica customizada.

    Por exemplo, uma vez escrevi um daemon de notificação que usa dzen2 como "pop-up". Você pode implementar qualquer lógica que desejar no método Notify().

    • 1
  2. Wilko Meyer
    2024-01-29T02:27:37+08:002024-01-29T02:27:37+08:00

    Acho que não tenho uma compreensão muito clara de como as notificações funcionam e quais são os "jogadores" interagindo para que as notificações funcionem:

    Tecnicamente (e independente de implementação), você precisará de pelo menos um daemon para lidar com notificações (por exemplo, recebê-las e processá-las), uma maneira de outros processos entregarem notificações ao referido daemon e um acordo (por exemplo, um padrão) sobre o que a notificação os dados passados ​​de um aplicativo para o daemon parecem poder ser processados.

    Para preencher os espaços em branco na maioria dos ambientes de desktop Linux:

    • Há um daemon de notificações (muitos ambientes de desktop como o Gnome trazem suas próprias implementações que são iniciadas com uma sessão do usuário; em outros casos, se você usar um desktop mais minimalista, talvez seja necessário configurar um serviço de daemon de notificação para isso; existem diferentes implementações deste último disponíveis, mako, para citar um para desktops wayland).
    • O daemon de notificação (se estiver em conformidade com a especificação de notificações de desktop) expõe uma interface D-BUS (D-BUS é um sistema de passagem de mensagens que permite a comunicação entre processos) que é então usada por outros processos para enviar notificações ao daemon.
    • A especificação de notificações da área de trabalho define o que o daemon espera que seja passado como uma notificação válida e quais parâmetros uma notificação pode ter (recomendo a leitura da especificação para se aprofundar nisso: Especificação de notificações da área de trabalho )

    E qual é o papel do libnotify?

    Libnotify é, simplesmente, uma biblioteca que fornece funcionalidade para enviar notificações compatíveis com a Especificação de Notificações de Área de Trabalho para um daemon de notificações que também está em conformidade com este padrão. Se você estiver construindo um aplicativo que suporte notificações de desktop no Linux, você pode usar libnotify para conseguir isso.

    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve