wall non trasmette ai terminali della GUI il 16.04


11

Il titolo lo riassume. In esecuzione wall <<< "TEST"mostra il messaggio in qualsiasi TTY ma non in alcun terminale della GUI (testato con gnome-terminale sakura).

Ho diversi script di monitoraggio della batteria e della temperatura che si basano wallsull'invio di un messaggio e dopo il recente aggiornamento a 16.04 ho notato che hanno smesso di funzionare nella GUI.

Non riesco a determinare se si tratta di un bug o qualcosa impedisce ai messaggi di essere visualizzati nella GUI.

Come devo procedere?

Informazioni addizionali:

L'esecuzione byobuin un terminale gui consente di vedere i messaggi sul muro


2
Forse correlato a askubuntu.com/questions/12654/… (guarda dentro xmessage, gxmessageo notify-send)
Nick Weinberg,

6
L'ho letto prima oggi. Sì, in qualche modo correlato, ma la grande obiezione è che 1) quella domanda è del 10.10, e wall ha funzionato nel 14.04 2) soluzioni a condizione che non siano soddisfacenti per me. notify-send funziona solo per brevi messaggi e solo nella GUI. wallha una buona comodità di usare un comando per tutti i terminali, invece di scrivere qualcosa per tty AND per gui E per tutte le altre sessioni che potrebbero essere su altri DISPLAYs, quindi questa non è un'ottima alternativa, almeno imho
Sergiy Kolodyazhnyy

Recentemente ho avuto lo stesso problema nel 15.010. Sono su Ubuntu Mate 16.04, e qui sembra funzionare. forse c'è un problema in una libreria sottostante. Forse guarda cosa fa il comando mesg? shutdown -k 5 funziona su tutti i terminali virtuali? La scrittura funziona correttamente? Guarderò i codici sorgente se trovo un'altra macchina in cui non funziona. Immagino che sia un problema di libreria dello spazio utente.
j0h

1
@ j0h in realtà, il problema è dovuto a gnome-terminal. Usava per aggiornare i record di accesso, quindi per esempio se avessi eseguito whoin Gnome Terminal, avrei mostrato tutte le tue schede aperte ma non più. Wall invia un messaggio solo a quelle sessioni del terminale che aggiornano i record di accesso. Mate utilizza diversi terminali per impostazione predefinita. L'ho capito molto tempo fa, ma in realtà non ho mai pubblicato una risposta. Lo farà ad un certo punto questa settimana.
Sergiy Kolodyazhnyy,

Ho un'idea di come potresti hackerarlo: <br>
Stancu Mihai,

Risposte:


5

A causa del modo in cui gnome-terminal funziona, wallnon lo registra come terminale. Una spiegazione più approfondita può essere trovata qui . Presumo che lo stesso sia vero per sakura.

Sulla base della risposta di Stancu Mihai , ho creato uno script che imita il modo in cui wallnormalmente funziona, incluso il banner con nome utente e timestamp (usa -n o --nobanner per rimuovere il banner). Lo script attualmente non supporta la lettura del messaggio da un file.

Puoi sostituire il normale wallcomando con questo aggiungendo un alias in ~/.bashrc:

echo 'alias wall="~/your/path/to/wall.sh"' >> ~/.bashrc

Esempio di utilizzo:

$ wall "some message"

Broadcast message from username@hostname (pts/19) (Wed Mar 29 11:07:35 2017):

some message

$ wall -h

Usage:
 wall [options] [message]

Write a message to all users.

Options:
 -n, --nobanner          do not print banner
 -h, --help              display this help and exit

Ottimo lavoro @danmou!
Stancu Mihai,

1

Sì, è vero che gnome-terminal non aggiorna i record di accesso, per questo motivo provo a trovare un'altra soluzione:

  1. Scopriamo tutti i pseudo terminali attivi
ps -ef | grep " pts/" | awk '{print $6}' | sort -u | tee terminals4message.txt

Questo ti aiuta a elencare tutte le sessioni del terminale desktop.

Un altro modo per inviare un messaggio alle sessioni del terminale desktop attivo

echo "$MESSAGE_to_send" | sudo tee /dev/pts/$terminal_number
  1. Non dimenticare le sessioni di tty
ps -ef | grep " tty" | awk '{print $6}' | sort -u | grep -v "pts" | tee terminals4message.txt

Questo ti aiuta a elencare tutte le sessioni pty

  1. Invio del messaggio a tutti
cat terminals4message.txt | while read TTY_TO; do echo -e "SYSTEM MESAGE: $(date) - \n MESAJ" | sudo tee /dev/$TTY_TO 1>/dev/null
  1. Ora mettiamo tutto insieme Puoi creare un bel script per sostituire la tua app a parete corrente e integrare tutto quanto sopra.
    Dopodiché puoi aggiungere al tuo ~ / .bashrc alias wall="your_wall_replacement.sh" In questo modo non devi cancellare il muro corrente

Scusa se qualcosa non va, dato che qualcuno non mi ha permesso di concentrarmi su questo argomento ... se notate qualcosa di strano, per favore lasciate un commento.

10x


Ecco un one-liner per questo. Ho sostituito awk con cut in modo che abbia un solo tipo di preventivo. ps -ef | grep -e " tty" -e " pts/" | tr -s " " | cut -d " " -f 6 | sort -u | while read TTY; do echo "MESSAGE" | tee /dev/$TTY 1>/dev/null; done
CJxD

0

Come altri suggeriscono che ci sono molti metodi, ho messo qui un metodo più diretto (facile) che ho trovato (adozione di cui ho echo "$MESSAGE_to_send" | sudo tee /dev/pts/$terminal_number: discusso qui).

echo "Your message" > /dev/pts/$terminal-no

Qui è terminal-nopossibile ottenere dall'altro terminale tramite il comando "tty".

tty

/dev/pts/12

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.