notify-send не работает из cron [duplicate]

Я сделал сценарий, который должен уведомить меня, когда появится новая глава манги, которую я читаю. Я использовал команду notify-send для этого. Программа работает, когда я пытаюсь запустить ее в терминале. Появляется уведомление. Однако, когда я разместил это в своем crontab, уведомление не отображается. Я уверен, что программа работает с тех пор, как я создал файл для меня. Файл был создан, но уведомление не появилось.

Вот мой скрипт

#!/bin/bash #One Piece Manga reminder #I created a file named .newop that contains the latest chapter. let new=$(cat ~/.newop) wget --read-timeout=30 -t20 -O .opreminder.txt http://www.mangareader.net/103/one-piece.html if (( $(cat .opreminder.txt | grep "One Piece $new" | wc -l) >=1 )) then (( new+=1 )) echo $new echo $new > ~/.newop notify-send "A new chapter of One Piece was released." else notify-send "No new chapter for One Piece." notify-send "The latest chapter is still $new." fi exit

И вот что я написал в своем crontab

0,15,30,45 12-23 * * 3 /home/jchester/bin/opreminder.sh
36
задан 10 October 2016 в 15:08

16 ответов

Команды должны ссылаться на свое местоположение. Таким образом, notify-send должен быть /usr/bin/notify-send

Все команды должны иметь полный путь.

Используйте команду whereis notify-send, чтобы увидеть, где ваши команды «живут»

17
ответ дан 18 July 2018 в 11:56

Команды должны ссылаться на свое местоположение. Таким образом, notify-send должен быть /usr/bin/notify-send

Все команды должны иметь полный путь.

Используйте команду whereis notify-send, чтобы увидеть, где ваши команды «живут»

17
ответ дан 24 July 2018 в 19:52

Если ваш скрипт в crontab работает от имени root, ответы выше, вероятно, не сработают. Попробуйте эту функцию, которая отлично подходит для меня в 16.04:

notify_all() { local title=$1 local msg=$2 who | awk '{print $1, $NF}' | tr -d "()" | while read u d; do id=$(id -u $u) . /run/user/$id/dbus-session export DBUS_SESSION_BUS_ADDRESS export DISPLAY=$d su $u -c "/usr/bin/notify-send '$title' '$msg'" done }

(Источник: https://unix.stackexchange.com/a/344377/7286)

0
ответ дан 18 July 2018 в 11:56

Я только что получил это, чтобы работать с настольным компьютером cinnamon на Ubuntu 15.10, используя следующий рецепт:

if [ ! -v DBUS_SESSION_BUS_ADDRESS ]; then pid=$(pgrep -u $LOGNAME cinnamon-sessio) eval "export $(\grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ)" fi notify-send "$RESUME" "$INFO"

Фокус в том, чтобы понять, что «cinnamon-session» слишком длинна для pgrep для find:

$ pgrep -u $LOGNAME cinnamon-session $ pgrep -u $LOGNAME cinnamon 30789 30917 30965 30981 31039 31335 $ ps -a | \grep cinnamon 30789 tty2 00:00:00 cinnamon-sessio 30917 tty2 00:00:02 cinnamon-settin 30965 tty2 00:00:00 cinnamon-launch 30981 tty2 00:04:15 cinnamon 31039 tty2 00:00:00 cinnamon-killer 31335 tty2 00:00:00 cinnamon-screen $ ps a | \grep cinnamon 4263 pts/1 S+ 0:00 grep cinnamon 30779 tty2 Ssl+ 0:00 /usr/lib/gdm/gdm-x-session --run-script cinnamon-session-cinnamon 30789 tty2 Sl+ 0:00 cinnamon-session --session cinnamon 30917 tty2 Sl+ 0:02 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/cinnamon-settings-daemon 30965 tty2 Sl+ 0:00 /usr/bin/python2 /usr/bin/cinnamon-launcher 30970 tty2 Sl+ 0:00 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/csd-printer 30981 tty2 Sl+ 4:16 cinnamon --replace 31039 tty2 Sl+ 0:00 /usr/bin/python2 /usr/bin/cinnamon-killer-daemon 31335 tty2 Sl+ 0:00 cinnamon-screensaver $ pgrep -u $LOGNAME cinnamon-sessio 30789

Мне также пришлось использовать \ grep, потому что мой grep псевдоним

$ alias grep alias grep='grep -n --color=always'
0
ответ дан 18 July 2018 в 11:56

Кажется, что в версии 13.04, по крайней мере, в Gnome Shell, все по-другому.

Во-первых, это то, что env печатает при запуске из задания cron zzyxy (не root): [ ! d1] HOME=/home/zzyxy LOGNAME=zzyxy PATH=/usr/bin:/bin XDG_RUNTIME_DIR=/run/user/zzyxy LANG=en_US.UTF-8 SHELL=/bin/sh PWD=/home/zzyxy

Чтобы заставить notify-send работать, кажется, необходимо установить переменную среды DBUS_SESSION_BUS_ADDRESS, в соответствии с комментарием DahitiF на ubuntuforums.org. Просто добавьте следующее к вашему фактическому описанию работы:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

Кажется, что не нужно устанавливать DISPLAY.

24
ответ дан 18 July 2018 в 11:56

Команда notify-send не будет отображать сообщение на вашем экране при запуске cron. Просто добавьте целевой экран вверху вашего скрипта, например:

export DISPLAY=:0
18
ответ дан 18 July 2018 в 11:56

В моем случае с ubuntu 16.04 любой явный путь был необходим, я решаю проблему, просто добавляя

DISPLAY =: 0

в первых строках crontab, перед вызовом notify- Отправить.

1
ответ дан 18 July 2018 в 11:56

Первым виновником является ваш файл crontab, вам также нужно указать имя пользователя, с которым должен выполняться сценарий, лучше сохранить его как root

0,15,30,45 12-23 * * 3 root /home/jchester/bin/opreminder.sh

, а затем вы должны использовать имя пользователя пользователь GUI внутри сценария и добавьте его для уведомления-отправки с помощью «sudo или su» для выполнения команды как пользователя, которому принадлежит пример GUI

:

su gnome_user_name -c 'notify-send "summary" "body"'

или

sudo -u gnome_user_name notify-send "summary" "body"

где gnome_user_name является именем пользователя, который запустил сеанс GUI, это вы вошли в систему, и если вы хотите сделать его динамическим выбором, вы можете получить его из

GNOME_USER=`ps -eo uname,cmd | grep gnome-session| head -1 | cut -d' ' -f1 `

пример:

su $GNOME_USER -c 'notify-send "summary" "body"'

или

sudo -u $GNOME_USER notify-send "summary" "body"
1
ответ дан 18 July 2018 в 11:56

Способ, которым двоичный код получает адрес dbus, кажется, изменился в последнее время. В Ubuntu 15.04 (Vivid Vervet) с «notify-send 0.7.6» необходимы следующие две переменные:

export HOME=/home/$notify_user export DISPLAY=:0.0

Оператор «krlmlr» оценивает штраф и устанавливает правильный адрес, но диалог не появится из задания cron.

1
ответ дан 18 July 2018 в 11:56

Если ваш скрипт в crontab работает от имени root, ответы выше, вероятно, не сработают. Попробуйте эту функцию, которая отлично подходит для меня в 16.04:

notify_all() { local title=$1 local msg=$2 who | awk '{print $1, $NF}' | tr -d "()" | while read u d; do id=$(id -u $u) . /run/user/$id/dbus-session export DBUS_SESSION_BUS_ADDRESS export DISPLAY=$d su $u -c "/usr/bin/notify-send '$title' '$msg'" done }

(Источник: https://unix.stackexchange.com/a/344377/7286)

0
ответ дан 24 July 2018 в 19:52

Я только что получил это, чтобы работать с настольным компьютером cinnamon на Ubuntu 15.10, используя следующий рецепт:

if [ ! -v DBUS_SESSION_BUS_ADDRESS ]; then pid=$(pgrep -u $LOGNAME cinnamon-sessio) eval "export $(\grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ)" fi notify-send "$RESUME" "$INFO"

Фокус в том, чтобы понять, что «cinnamon-session» слишком длинна для pgrep для find:

$ pgrep -u $LOGNAME cinnamon-session $ pgrep -u $LOGNAME cinnamon 30789 30917 30965 30981 31039 31335 $ ps -a | \grep cinnamon 30789 tty2 00:00:00 cinnamon-sessio 30917 tty2 00:00:02 cinnamon-settin 30965 tty2 00:00:00 cinnamon-launch 30981 tty2 00:04:15 cinnamon 31039 tty2 00:00:00 cinnamon-killer 31335 tty2 00:00:00 cinnamon-screen $ ps a | \grep cinnamon 4263 pts/1 S+ 0:00 grep cinnamon 30779 tty2 Ssl+ 0:00 /usr/lib/gdm/gdm-x-session --run-script cinnamon-session-cinnamon 30789 tty2 Sl+ 0:00 cinnamon-session --session cinnamon 30917 tty2 Sl+ 0:02 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/cinnamon-settings-daemon 30965 tty2 Sl+ 0:00 /usr/bin/python2 /usr/bin/cinnamon-launcher 30970 tty2 Sl+ 0:00 /usr/lib/x86_64-linux-gnu/cinnamon-settings-daemon/csd-printer 30981 tty2 Sl+ 4:16 cinnamon --replace 31039 tty2 Sl+ 0:00 /usr/bin/python2 /usr/bin/cinnamon-killer-daemon 31335 tty2 Sl+ 0:00 cinnamon-screensaver $ pgrep -u $LOGNAME cinnamon-sessio 30789

Мне также пришлось использовать \ grep, потому что мой grep псевдоним

$ alias grep alias grep='grep -n --color=always'
0
ответ дан 24 July 2018 в 19:52

Кажется, что в версии 13.04, по крайней мере, в Gnome Shell, все по-другому.

Во-первых, это то, что env печатает при запуске из задания cron zzyxy (не root): [ ! d1] HOME=/home/zzyxy LOGNAME=zzyxy PATH=/usr/bin:/bin XDG_RUNTIME_DIR=/run/user/zzyxy LANG=en_US.UTF-8 SHELL=/bin/sh PWD=/home/zzyxy

Чтобы заставить notify-send работать, кажется, необходимо установить переменную среды DBUS_SESSION_BUS_ADDRESS, в соответствии с комментарием DahitiF на ubuntuforums.org. Просто добавьте следующее к вашему фактическому описанию работы:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

Кажется, что не нужно устанавливать DISPLAY.

24
ответ дан 24 July 2018 в 19:52
  • 1
    Спасибо, это то, что, наконец, помогло мне. На Xubuntu вы должны изменить gnome-session на xfce4-session. – shrx 19 February 2015 в 14:05
  • 2
    Это единственный ответ на работу 14.04, а также очевидный намек на принятый. – Wtower 28 February 2015 в 15:34
  • 3
    У меня не было gnome-session и вместо этого использовалось gnome-shell (будьте осторожны, есть также gnome-shell-calendar-server, поэтому pgrep получит 2 pids). Мне также понадобилось DISPLAY=:0, потому что я использую 2 физических экрана, и он не был определен. Благодаря! – soyuka 27 May 2015 в 18:05
  • 4
    Если вы используете Openbox (например, на CB ++), замените openbox на gnome-session. – ACK_stoverflow 3 October 2016 в 22:06

Команда notify-send не будет отображать сообщение на вашем экране при запуске cron. Просто добавьте целевой экран вверху вашего скрипта, например:

export DISPLAY=:0
18
ответ дан 24 July 2018 в 19:52
  • 1
    Это то, что я должен был сделать и в 14.10. В противном случае я получил бы эту ошибку gdk_mir_display_open Failed to connect to Mir: Failed to connect to server socket: No such file or directory Option parsing failed: Cannot open display: – Joelmob 30 October 2014 в 03:43
  • 2
    Эта. И используйте echo $DISPLAY в терминале, чтобы убедиться, что ваш дисплей действительно :0 (обычно это, но не всегда). – Mark 7 February 2016 в 20:16
  • 3
    Только это сработало для меня, я использую Linux Mint – Harendra Singh 6 April 2016 в 11:32

В моем случае с ubuntu 16.04 любой явный путь был необходим, я решаю проблему, просто добавляя

DISPLAY =: 0

в первых строках crontab, перед вызовом notify- Отправить.

1
ответ дан 24 July 2018 в 19:52
  • 1
    Это единственное, что необходимо для его работы 16.04. – Jonathan Landrum 4 April 2018 в 00:15

Первым виновником является ваш файл crontab, вам также нужно указать имя пользователя, с которым должен выполняться сценарий, лучше сохранить его как root

0,15,30,45 12-23 * * 3 root /home/jchester/bin/opreminder.sh

, а затем вы должны использовать имя пользователя пользователь GUI внутри сценария и добавьте его для уведомления-отправки с помощью «sudo или su» для выполнения команды как пользователя, которому принадлежит пример GUI

:

su gnome_user_name -c 'notify-send "summary" "body"'

или

sudo -u gnome_user_name notify-send "summary" "body"

где gnome_user_name является именем пользователя, который запустил сеанс GUI, это вы вошли в систему, и если вы хотите сделать его динамическим выбором, вы можете получить его из

GNOME_USER=`ps -eo uname,cmd | grep gnome-session| head -1 | cut -d' ' -f1 `

пример:

su $GNOME_USER -c 'notify-send "summary" "body"'

или

sudo -u $GNOME_USER notify-send "summary" "body"
1
ответ дан 24 July 2018 в 19:52
  • 1
    Я думаю, что когда ваше имя пользователя длиннее X символов, ваша usernma усечена: например, мое имя пользователя oniltonmaciel, но $GNOME_USER будет показывать onilton+ (не работает) – Onilton Maciel 26 April 2015 в 00:03
  • 2
    исправил его с лучшей командой – Sundeep Borra 27 April 2015 в 12:01

Способ, которым двоичный код получает адрес dbus, кажется, изменился в последнее время. В Ubuntu 15.04 (Vivid Vervet) с «notify-send 0.7.6» необходимы следующие две переменные:

export HOME=/home/$notify_user export DISPLAY=:0.0

Оператор «krlmlr» оценивает штраф и устанавливает правильный адрес, но диалог не появится из задания cron.

1
ответ дан 24 July 2018 в 19:52

Другие вопросы по тегам:

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