стена не транслируется на графические терминалы 16 апреля

11

Название подводит итог. Запуск wall <<< "TEST"показывает сообщение в любом TTY, но не в любом терминале с графическим интерфейсом (проверено с помощью gnome-terminalи sakura).

У меня есть несколько сценариев контроля батареи и температуры, которые основаны на wallсообщении, и после недавнего обновления до 16.04 я заметил, что они перестали работать в GUI.

Я не могу определить, является ли это ошибкой или что-то мешает отображению сообщений в графическом интерфейсе.

Как мне поступить?

Дополнительная информация:

Запуск byobuв графическом терминале позволяет видеть сообщения на стене

Сергей Колодяжный
источник
2
Возможно , связано с askubuntu.com/questions/12654/... (взгляд в xmessage, gxmessage, или notify-send)
Ник Вайнберг
6
Я прочитал это ранее сегодня. Да, в некотором роде, но большое возражение заключается в том, что 1) этот вопрос относится к 10.10, а Уолл работал в 14.04 2) решения при условии, что они меня не устраивают. notify-send работает только для коротких сообщений и только в графическом интерфейсе. wallимеет удобное использование одной команды для всех терминалов вместо того, чтобы писать что-то для tty AND для gui AND для всех других сессий, которые могут быть на других DISPLAYs, так что это не очень хорошая альтернатива, по крайней мере, imho
Сергей Колодяжный
У меня была такая же проблема недавно в 15.010. Я на 16.04 Ubuntu Mate, и это, кажется, здесь работает. возможно, есть проблема в базовой библиотеке. Может быть, посмотрите, что делает команда mesg? shutdown -k 5 работает на всех виртуальных терминалах? Правильно ли работает запись? Я посмотрю на исходники, если найду другую машину, на которой она не работает. Я предполагаю, что это проблема библиотеки пользовательского пространства.
10
1
@ j0h на самом деле проблема связана с gnome-терминал. Раньше он обновлял записи входа в систему, поэтому, например, если вы whoраньше работали в терминале gnome, я бы показывал все ваши открытые вкладки, но больше не буду. Wall отправляет сообщения только тем терминальным сеансам, которые обновляют записи входа. Mate использует другой терминал по умолчанию. Я понял это давно, но на самом деле никогда не публиковал ответ. Сделаем это в какой-то момент на этой неделе.
Сергей Колодяжный
У меня есть идея, как вы могли взломать это: <br>
Stancu Mihai

Ответы:

5

Из-за того, как работает gnome-терминал, wallне регистрирует его как терминал. Более подробное объяснение можно найти здесь . Я предполагаю, что то же самое верно для сакуры.

Основываясь на ответе Станку Михая , я создал скрипт, который имитирует wallобычную работу, включая баннер с именем пользователя и отметкой времени (используйте -n или --nobanner для удаления баннера). В настоящее время скрипт не поддерживает чтение сообщения из файла.

Вы можете заменить обычную wallкоманду этой, добавив псевдоним в ~/.bashrc:

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

Пример использования:

$ 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
danmou
источник
Отличная работа @danmou!
Станку Михай
1

Да, это правда, что gnome-терминал не обновляет регистрационные записи, поэтому я пытаюсь найти другое решение:

  1. Давайте выясним все активные псевдо-терминалы
ps -ef | grep " pts/" | awk '{print $6}' | sort -u | tee terminals4message.txt

Это поможет вам составить список всех сеансов рабочего стола терминала.

Еще один способ отправить сообщение на активные сеансы терминала рабочего стола

echo "$MESSAGE_to_send" | sudo tee /dev/pts/$terminal_number
  1. Не забывайте о сессиях tty
ps -ef | grep " tty" | awk '{print $6}' | sort -u | grep -v "pts" | tee terminals4message.txt

Это поможет вам перечислить все сеансы pty

  1. Отправка сообщения всем
cat terminals4message.txt | while read TTY_TO; do echo -e "SYSTEM MESAGE: $(date) - \n MESAJ" | sudo tee /dev/$TTY_TO 1>/dev/null
  1. Теперь давайте соберем все воедино. Вы можете создать хороший скрипт для замены вашего текущего настенного приложения и интеграции всех вышеперечисленных вещей.
    После этого вы можете добавить в ваш ~ / .bashrc alias wall="your_wall_replacement.sh" Таким образом, вам не нужно удалять текущую стену

Извините, если что-то не так, потому что кто-то не позволил мне сосредоточиться на этом вопросе ... если вы, ребята, заметили что-то странное, пожалуйста, оставьте комментарий.

10x

Станку Михай
источник
Вот одна строка для этого. Я заменил awk на cut, поэтому он содержит только один тип цитаты. 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

Поскольку другие предполагают, что есть много методов, я поместил здесь более прямой (легкий) метод, который я нашел (принятие echo "$MESSAGE_to_send" | sudo tee /dev/pts/$terminal_number: обсуждено здесь.)

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

Здесь terminal-noможно получить с другого терминала с помощью команды "tty".

tty

/dev/pts/12

Braghadees
источник