Использование уведомления-отправки с помощью 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 для переменной
  • Команда, которая возвращает либо идентификатор процесса, если работает, либо какой-либо другой результат, если нет?
  • Как успешно выйти из сценария оболочки, чтобы подпроцесс python считал, что он успешно выходит?
  • Как получить функцию getopts при вызове другой функции внутри файла
  • Как создать относительную символическую ссылку с учетом относительного пути?
  • Выполнение команды на удаленном хосте не выполняется
  • Что означает выражение $ (<"dir / file") в bash?
  • Как разбить длинную строку на несколько строк в подсказке read -p в исходном коде?
  • Как получить общий размер всего в каталоге в одной строке?
  • Расширяет ли расширение zsh по-разному в неинтерактивных скриптах?
  • Возможно ли «защитить» символ IFS от разделения поля?
  • Interesting Posts

    Выходные линии между двумя датами параметров ВКЛЮЧАЯ первую дату параметра, но не вторую

    Инициализация поиска в vi перед запуском

    sh: -c: строка 1: синтаксическая ошибка: неожиданный конец файла

    Почему я получаю разные результаты с тем же пользователем и командой history?

    Новая GeForce установлена, заикается, с чего начать?

    Может ли зависимость systemd применяться только к действию «ExecStart» устройства?

    Почему разные пути скриптов sudo su и bash?

    Переделка scancode для Caps Lock

    Как определить, какая группа отвечает за ваши права sudo?

    bash $ (printf "% s \ n") не создает многострочный

    Shell Script – оптимизация Awk

    Обнаружить версию debian в файле пакета правил

    Журналы загрузки RHEL7 показывают ошибки systemd-fsck, ссылающиеся на fsck.ext2 при попытке запуска в файловой системе XFS

    проверить код выхода процессов, запущенных параллельно из сценария

    Завершить ввод текста в GPG

    Linux и Unix - лучшая ОС в мире.