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

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

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

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

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

код:

[[email protected] ~]$ crontab -l
* * * * *  /home/matrix/scripts/notify.sh

[[email protected] ~]$ 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

[[email protected] ~]$ cat /tmp/crontest
testing cron
now tested notify-send

[[email protected] ~]$ 

Как вы можете видеть эхо до & после отправки уведомлений-отправки.
Также я попытался установить DISPLAY=:0.0

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

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

[[email protected] ~]$ 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, который я могу использовать?

27 голосов | спросил justsomeone 27 Jpm1000000pmMon, 27 Jan 2014 23:12:32 +040014 2014, 23:12:32

10 ответов


15

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

DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority

# m h  dom mon dow   command 
* * * * *  /usr/bin/notify-send "hello"

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

ответил terdon 27 Jpm1000000pmMon, 27 Jan 2014 23:24:10 +040014 2014, 23:24:10
7

Самый безопасный способ получить переменные окружения, связанные с X-сеансом, - это получить их из среды процесса пользователя, который зарегистрировался на X. Ниже приведена адаптация сценария, который я использую для одной и той же цели (хотя DBUS_SESSION_BUS_ADDRESS, похоже, не проблема для меня на 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, который он находит, хотя вы можете добавить цикл, чтобы отправить его всем пользователям. Надеюсь, это поможет.

Update

Похоже, что обновления формата utmp вызывают who для печати дисплея вместо 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"
ответил Graeme 27 Jpm1000000pmMon, 27 Jan 2014 23:51:56 +040014 2014, 23:51:56
1

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

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

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

ответил blujay 4 +03002015-10-04T02:33:13+03:00312015bEurope/MoscowSun, 04 Oct 2015 02:33:13 +0300 2015, 02:33:13
1

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

ответил xolox 22 AMpFri, 22 Apr 2016 01:28:51 +030028Friday 2016, 01:28:51
1

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

#!/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"

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

ответил user1112789 11 FebruaryEurope/MoscowbSat, 11 Feb 2017 18:26:56 +0300000000pmSat, 11 Feb 2017 18:26:56 +030017 2017, 18:26:56
1

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

# 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

ответил PJ Brunet 16 FebruaryEurope/MoscowbThu, 16 Feb 2017 22:19:52 +0300000000pmThu, 16 Feb 2017 22:19:52 +030017 2017, 22:19:52
0

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

#!/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 

похожий скрипт, используя notify-send

#!/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.

ответил cirrus 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 03 Sep 2015 12:26:12 +0300 2015, 12:26:12
0

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

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

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

Оставив любой из них, он прекратил работу.

ответил BenJ 5 PMpWed, 05 Apr 2017 19:57:43 +030057Wednesday 2017, 19:57:43
0

Использование sudo:

sudo -u $currentxuser notify-send $message

Совет:

Мы можем получить текущий пользователь x с помощью этой команды

ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' '

Кроме того ...

currentxuser=$(ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' ')
echo $currentxuser

Полезно знать:

Cron, работающий под управлением root, не имеет доступа к x, поэтому все команды gui не будут отображаться, одно простое решение - добавить root к авторизованному пользователю x для текущего пользователя x с помощью этой команды

из командной оболочки x

xhost local:root

или

sudo -u $currentxuser xhost local:root
ответил intika 19 PM00000040000000431 2018, 16:19:04
-1

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

env="$(
  ps -C init -o uid,pid | while read u p; do
    [ "$u" = "`id -u`" ] || continue
    grep -az '^DBUS_SESSION_BUS_ADDRESS=' /proc/$p/environ | xargs -0
  done | tail -1
)"

export "$env"

notify-send "test"
ответил Daniel Alder 13 J000000Monday15 2015, 13:51:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132