Используя командную строку, я хотел бы показывать уведомление на каждом запущенном дисплее X. (и работает консоль)
Что-то вроде:
notify-send-all 'Warning' 'Nuclear launch in 5 minutes, please evacuate'
Есть ли программа, которая сделает это? Если нет, то можно ли это реализовать с помощью bash?
command-line
xorg
tty
console
notifications
Стефан
источник
источник
Ответы:
Вы можете отправить сообщение на все консоли с помощью командной стены.
Для отправки уведомлений под X есть notify-send, которая отправляет уведомление текущему пользователю на текущем дисплее. (Из вашего вопроса, я думаю, вы уже знаете это.) Вы можете развить это с помощью некоторых скриптов bash. В основном вы должны выяснить, какие пользователи на каких X-дисплеях. После того, как вы получили эту информацию, вы можете использовать уведомление-отправить, как это:
Где fschmitt - это пользователь на дисплее 0. Вы можете проанализировать вывод команды "who", чтобы найти всех пользователей и их дисплеи. Вывод выглядит так
Видите ли, есть два пользователя, выполняющие сеансы X, markmerk3 на дисплее 0 и seamonkey на дисплее 1. Я думаю, вам нужно выполнить grep для tty [0-9] *, а затем убедиться, что в конце строки есть (: [0 -9.] *) Чтобы избавиться от логинов консоли и извлечь отображаемый идентификатор из строки в скобках.
источник
who
сообщает вам, кто вошел в систему и на каком дисплее X отображается этот вход. Возможно, вам просто придется его отфильтровать.who | awk '/\(:[0-9]+\)/ {gsub("[:|(|)]","");print "DISPLAY=:"$5 " sudo -u " $1 " notify-send \"Message\""}' | bash
. Кроме того, вы можете захотеть увидеть unix.stackexchange.com/questions/1596/…Эта ветка немного старая, извините, но я надеюсь, что смогу добавить что-то полезное в тему. (также Йозеф Куфнер написал хороший сценарий, на мой вкус он был слишком длинным и использует PHP)
Мне также был нужен инструмент, как описано в исходном вопросе (чтобы отправить сообщение всем активным пользователям X). И основываясь на ответах здесь, я написал этот небольшой скрипт только для bash, который ищет активных пользователей X (используя «кто»), а затем запускает команду notify-send для каждого активного пользователя.
И самое лучшее: вы можете использовать мой скрипт в точности как «notify-send» со всеми его параметрами! ;-)
уведомительный отправить-всего:
Скопируйте приведенный выше код в файл с именем «notify-send-all», сделайте его исполняемым и скопируйте его в / usr / local / bin или / usr / bin (как вам нравится). Затем запустите его, например, от имени пользователя root в сеансе консоли следующим образом:
notify-send-all -t 10000 "Warning" "The hovercraft is full of eels!"
Я использую его уже несколько месяцев на разных машинах, и у меня до сих пор не было проблем, и я протестировал его на настольных компьютерах MATE и Cinnamon. Также успешно работает в cron и anacron.
Я написал этот скрипт для / под ArchLinux, поэтому, пожалуйста, сообщите мне, если у вас проблемы с другими дистрибутивами Linux или рабочими столами.
источник
|egrep
?? такое egrep команда?awk '{print $1$5}'
этого лучше использоватьawk '{print $1$NF}'
, чтобы не нарушать некоторые локали, где дата форматируется с пробелами (например,Jun 3
вместо2017-06-03
). Вот также версия для уведомления конкретного пользователя вместо всех пользователей: gist.github.com/shvchk/ba2f0da49bf2f571d6bf606d96f289d7grep -E
и добавления/bin
к пути (см. Редактирование). Не стесняйтесь вернуться, если вы возражаетеМне это тоже нужно было для некоторых системных уведомлений. Вот мое решение. Он просматривает / proc, чтобы найти все сеансовые шины, а затем выполняет уведомление-отправку для каждой из них (один раз для каждой шины). Все аргументы передаются без изменений для реального уведомления-отправки.
источник
В Ubuntu 16.04 я хотел получать уведомления от скрипта, работающего от имени пользователя root, из crontab. После установки переменных среды
sudo -u $user
по какой-то причинеsh -c "..." $user
не работал , но работает.Итак, я сейчас использую эту функцию:
Как найти переменную DBUS_SESSION_BUS_ADDRESS, вероятно, зависит от вашего дистрибутива. В Ubuntu 16.04 он есть
/run/user/$UID/dbus-session
, который можно просто получить.id -u
используется в функции выше, чтобы получить UID из имени пользователя, возвращаемогоwho
.источник
Вот обновление скрипта Энди: способ, которым он определил
DBUS_SESSION_BUS_ADDRESS
, не работает на Centos 7. Такжеwho
команда по какой-то причине не перечислила некоторые сеансы, поэтомуps aux
вместо этого я анализирую вывод. В этом сценарии предполагается, что пользователи вошли в систему с помощью X2GO (nxagent
), но его следует легко настроить для других случаев.источник
источник