Я использую Arch Linux с KDE / Awesome WM. Я пытаюсь заставить
notify-send
работать cron
.
Я попытался установить DISPLAY
/ XAUTHORITY
переменные и работает notify-send
с "sudo -u", все безрезультатно.
Я могу звонить, уведомлять-отправлять в интерактивном режиме с сессии и получать уведомления.
FWIW, задание cron работает нормально, что я проверял, выводя вещи во временный файл. Это просто «уведомить-отправить», которая не работает.
Код:
[matrix@morpheus ~]$ crontab -l
* * * * * /home/matrix/scripts/notify.sh
[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send
[matrix@morpheus ~]$
Как вы можете видеть эхо до и после уведомления-отправки сработало.
Также я попробовал установкуDISPLAY=:0.0
ОБНОВЛЕНИЕ: я искал немного больше и обнаружил, что DBUS_SESSION_BUS_ADDRESS должен быть установлен. И после того, как я жестко запрограммировал это, используя значение, которое я получил от моего интерактивного сеанса, крошечное маленькое «привет» сообщение начало появляться на экране каждую минуту!
Но уловка в том, что эта переменная не является постоянной для каждого поста, поэтому я попробую решение с именованным каналом, предложенное там.
[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
Поскольку cron
, похоже, не поддерживается отправка уведомлений (по крайней мере, напрямую), существует ли какая-то другая система уведомлений, более cron
удобная для использования?
&>>/tmp/crontest
в строку отправки уведомлений и посмотреть,notify-send
дает ли какие-либо сообщения об ошибках.Ответы:
Вам нужно установить
DBUS_SESSION_BUS_ADDRESS
переменную. По умолчанию cron не имеет доступа к переменной. Чтобы исправить это, поместите следующий скрипт куда-нибудь и вызывайте его, когда пользователь входит в систему, например, используя awesome иrun_once
функцию, упомянутую в вики. Подойдет любой метод, поскольку он не причиняет вреда, если функция вызывается чаще, чем требуется.Это создает файл, содержащий необходимую переменную среды Dbus. Затем в скрипте, вызванном cron, вы импортируете переменную, используя скрипт:
Вот ответ, который использует тот же механизм.
источник
Вам нужно установить переменные в самом crontab:
Нет
sudo
необходимости, по крайней мере, не в моей системе.источник
Самый безопасный способ получить переменные среды, связанные с сеансом X, - это получить их из среды процесса пользователя, вошедшего в X. Вот адаптация сценария, который я использую для той же цели (хотя DBUS_SESSION_BUS_ADDRESS не ' мне кажется, это проблема для меня в Debian):
Это отправляет сообщение первому найденному пользователю X, хотя вы можете добавить цикл, чтобы отправить его всем пользователям.
Обновить
Кажется, что обновления в формате utmp приводят
who
к выводу дисплея вместо tty во втором столбце. Это на самом деле делает вещи проще, ранее это только печатало отображение в комментарии в конце, и я решил, что на исходный ответ полагаться не стоит. Если это так, попробуйте это:источник
who_line
команде нет tty . Выход выглядит такme :0 2015-09-23 10:40 ? 17234
.Этот однострочник работал для меня в Манджаро с Крони:
Без очень уродливого DBUS_blah_blah это не работает вообще. Я также нашел
journalctl -xb -u cronie
полезным. Я еще не знаком с Cronie, но создал свой "crontab" как/etc/cron.d/mycronjobs
и я не уверен, требуется ли это имя файла, или он просто читает все в каталоге cron.d.Я нашел решение здесь https://wiki.archlinux.org/index.php/Desktop_notifications
источник
Я использую i3 на Ubuntu 18.04. Мой способ решить это:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
источник
Этого достаточно, чтобы заставить меня отправлять уведомления-отправлять в Cronjob на Ubuntu Trusty:
Он просто экспортирует
DISPLAY
для пользователя, от которого выполняется cronjob. У меня работает без настройкиXAUTHORITY
илиDBUS_SESSION_BUS_ADDRESS
.источник
Для тех в Linux, кому удобно устанавливать пакеты Python, я только что выпустил программу notify-send-headless, которая хорошо работает для меня. Он ищет
/proc
требуемые переменные имени пользователя и среды, а затем запускаетсяnotify-send
с этими переменными (при необходимости онsudo
переключается на нужного пользователя).источник
Вы также можете сделать скрипт:
Тогда запустите это с
sudo
. Однако, посколькуcrontab -e
все команды выполняются пользователем, который его создал, при вызове безsudo
:По крайней мере, это для меня. Кажется, все зависит от конфигурации среды.
источник
Я использую этот скрипт в cron для публикации MPD, теперь играю в твиттере каждый час
аналогичный скрипт с использованием notify-send
возможно, у вас возникли проблемы, поскольку KDE использует собственный IIRC для уведомлений.
источник
За что его стоит ....
Мне пришлось использовать ВСЕ из следующего на Debian Jessie, чтобы заставить это работать ...
Отсутствие любого из них привело к тому, что оно перестало работать.
источник
*-0
в вашемsession-bus
каталоге не будет буквально вызванного файла . Вы могли иметь в видуsource "$HOME"/.dbus/session-bus/*-0
.Использование sudo:
Чаевые :
С помощью этой команды мы можем получить текущего пользователя x
К тому же...
Хорошо знать :
Cron, работающий под root, не имеет доступа к x, поэтому все команды gui не будут отображаться, одно простое решение - добавить root к авторизованному пользователю x для текущего пользователя x с помощью этой команды.
из пользовательской оболочки x
или
источник
Вот менее сложный сценарий, чем тот, что предоставил Грэм. Его сценарий не работал для меня,
$who_line
всегда был пустым. Мой сценарий не тратит столько времени на поиск процесса. Вместо этого он просто пробует все и выбирает последнее найденное полезное значение. Я использую xubuntu 14.04 и у меня работает несколько контейнеров lxc, которые, вероятно, запутывают этот вид сценариев.источник
DBUS_SESSION_BUS_ADDRESS
. Я могу получить это из своих оболочек, но не из процесса Xorg.