Использование уведомления-отправки с помощью cron

Я использую Arch Linux с KDE / Awesome WM. Я пытаюсь получить notify-send на работу с cron .

Я попытался установить переменные DISPLAY / XAUTHORITY и запустить notify-send с помощью «sudo -u», все без результата.

Я могу вызвать уведомление-отправлять в интерактивном режиме из сеанса и получать уведомления.

FWIW, задание cron работает отлично, что я проверял, повторяя материал во временном файле. Это просто сообщение «notify-send», которое не работает.

Код:

 [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

UPDATE: я искал немного больше и обнаружил, что необходимо установить DBUS_SESSION_BUS_ADDRESS . И после hardcoding, используя значение, которое я получил от моего интерактивного сеанса, каждое маленькое «привет» сообщение начинало появляться на экране каждую минуту!

Но уловка эта переменная не является постоянной в этом сообщении, поэтому я попробую предлагаемое там решение с именем pipe.

 [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 , похоже, не поддерживает notify-send (по крайней мере, не напрямую), есть ли какая-то другая система уведомлений, более дружественная к cron которую я могу использовать?

10 Solutions collect form web for “Использование уведомления-отправки с помощью cron”

Вам нужно установить переменную DBUS_SESSION_BUS_ADDRESS . По умолчанию cron не имеет доступа к переменной. Чтобы исправить это, поместите следующий скрипт где-нибудь и вызовите его, когда пользователь входит в систему, например, используя awesome и функцию run_once упомянутую в вики. Любой метод будет действовать, поскольку это не наносит вреда, если функция вызывается чаще, чем требуется.

 #!/bin/sh touch $HOME/.dbus/Xdbus chmod 600 $HOME/.dbus/Xdbus env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus exit 0 

Это создает файл, содержащий требуемую переменную окружения Dbus. Затем в скрипте, который вызывается cron, вы импортируете переменную путем поиска сценария:

 if [ -r "$HOME/.dbus/Xdbus" ]; then . "$HOME/.dbus/Xdbus" fi 

Вот ответ, который использует тот же механизм.

Вам нужно установить переменные в самом crontab:

 DISPLAY=:0.0 XAUTHORITY=/home/matrix/.Xauthority # mh dom mon dow command * * * * * /usr/bin/notify-send "hello" 

Не нужно sudo , по крайней мере, не в моей системе.

Самый безопасный способ получить переменные окружения, связанные с X-сеансом, – это получить их из среды процесса пользователя, который зарегистрировался на X. Ниже приведена адаптация сценария, который я использую для той же цели (хотя DBUS_SESSION_BUS_ADDRESS doesn ' t, похоже, для меня проблема в Debian):

 X=Xorg # works for the given X command copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS" tty=$(ps h -o tty -C $X | head -1) [ -z "$tty" ] && exit 1 # calling who with LANG empty ensures a consistent date format who_line=$(LANG= who -u | grep "^[^ ]\+[ ]\+$tty") x_user=$(echo $who_line | cut -d ' ' -f 1) # the user associated with the tty pid=$(echo $who_line | cut -d ' ' -f 7) # the user's logon process for env_name in $copy_envs do # if the variable is not set in the process environment, ensure it does not remain exported here unset "$env_name" # use the same line as is in the environ file to export the variable export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null done sudo -u "$x_user" notify-send "hello" 

Это отправляет сообщение первому пользователю X, который он находит, хотя вы можете добавить цикл для отправки его всем пользователям. Надеюсь это поможет.

Обновить

Похоже, что обновления формата utmp заставляют печатать дисплей вместо tty во втором столбце. Это на самом деле упрощает процесс, ранее он только печатал дисплей в комментарии в конце, и я решил, что нецелесообразно полагаться на исходный ответ. Если это так, попробуйте следующее:

 X=Xorg # works for the given X command copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS" # calling who with LANG empty ensures a consistent date format who_line=$(LANG= who -u | awk '$2 ~ ":[0-9]"') x_user=$(echo $who_line | cut -d ' ' -f 1) # the user associated with the tty pid=$(echo $who_line | cut -d ' ' -f 7) # the user's logon process for env_name in $copy_envs do # if the variable is not set in the process environment, ensure it does not remain exported here unset "$env_name" # use the same line as is in the environ file to export the variable export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null done sudo -u "$x_user" notify-send "hello" 

Для тех, кто в Linux, которые удобны в установке пакетов Python, я только что выпустил программу notify-send-headless, которая хорошо работает для меня. Он ищет /proc для требуемых переменных имени пользователя и среды, а затем запускает notify-send с этими переменными (он будет использовать sudo для переключения на нужного пользователя, если это необходимо).

Вы также можете создать скрипт:

 #!/usr/bin/env bash runuser -l [yourusername] -c 'DISPLAY=:0 notify-send "hey there user"' 

Затем запустите его с помощью sudo . Однако, поскольку crontab -e запускает все команды с пользователем, который его создал, для вызова без sudo должно быть достаточно:

 #!/usr/bin/env bash DISPLAY=:0 notify-send "hey there user" 

По крайней мере, это для меня. Все это, похоже, зависит от конфигурации среды.

Этот однострочник работал для меня в Манджаро с Крони:

 # Note: "1000" would be your user id, the output of... "id -u <username>" 10 * * * * pj DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hello world!' 'This is an example notification.' 

Без очень уродливого DBUS_blah_blah это вообще не работает. Я также нашел journalctl -xb -u cronie полезным. Я еще не знаком с Cronie, но создал свой «crontab» как /etc/cron.d/mycronjobs и я не уверен, требуется ли это имя файла, или если он просто читает все в каталоге cron.d.

Я нашел решение здесь https://wiki.archlinux.org/index.php/Desktop_notifications

Я использую этот скрипт в cron для публикации MPD, который теперь играет в twitter каждый час

 #!/bin/bash export DISPLAY=":0.0" msg=$(mpc current -h 192.168.1.33) twitter set "#MPD Server nowplaying $msg : http://cirrus.turtil.net:9001" #ttytter -status="#MPD Server nowplaying $msg. http://cirrus.turtil.net:9001" exit 

похожий скрипт с помощью уведомления-отправки

 #!/bin/bash export DISPLAY=":0.0" notify-send -i ~/.icons/48arch.png 'OS- Archlinux x86_64 : DWM Window Manager' 'Installed on Sun Apr 21 2013 at 18:17:22' exit 

вы можете испытывать проблемы, поскольку KDE использует свой собственный идентификатор-идентификатор IIRC.

Этого достаточно, чтобы сделать уведомление-отправить работу для меня в cronjob на Ubuntu Trusty:

 #!/bin/bash export DISPLAY=$(who -u | awk '/\s:[0-9]\s/ {print $2}') 

Он просто экспортирует DISPLAY для пользователя, с которым работает cronjob. Он работает для меня без установки XAUTHORITY или DBUS_SESSION_BUS_ADDRESS .

За что его стоит ….

Я должен был использовать ВСЕ из следующего на Debian Jessie, чтобы заставить это работать …

 export DISPLAY=:0.0 export HOME=/home/$user source "$HOME/.dbus/session-bus/*-0" 

Оставляя какой-либо из них, он прекратил работать.

Здесь менее сложный сценарий, чем тот, который предоставляет Грэм. Его сценарий не работал для меня, $who_line всегда пуст. Мой сценарий не тратит столько времени на поиск процесса. Вместо этого он просто пробует все и выбирает последнее полезное значение. Я запускаю xubuntu 14.04 и запускаю несколько контейнеров lxc, которые, вероятно, путают подобные сценарии.

 env="$( ps -C init -o uid,pid | while read up; do [ "$u" = "`id -u`" ] || continue grep -az '^DBUS_SESSION_BUS_ADDRESS=' /proc/$p/environ | xargs -0 done | tail -1 )" export "$env" notify-send "test" 
  • Использование grep для поиска первых двух номеров IP-адресов?
  • Отложить переменное расширение до подоболочки
  • bash set -o errexit проблема или способ увеличения переменной?
  • inotifywait для перемещения файла после загрузки пользователем
  • Как я могу загрузить функции этого файла скрипта, не загружая его каждый раз? «Команда не найдена» (основы Bash / scripting)
  • Странная разница между pwd и / bin / pwd
  • Make не работает при вызове из сценария bash
  • Передать переменную в директиву выполнения без выполнения содержимого переменной
  • Фоновая и передняя задача и выполнение задач параллельно
  • Почему корневой вывод bash окрашен, но `sudo ls` нет?
  • Можно ли запустить фоновый процесс с определенным рабочим каталогом?
  • Linux и Unix - лучшая ОС в мире.