Я сделал сценарий, который должен уведомить меня, когда появится новая глава манги, которую я читаю. Я использовал команду 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
Команды должны ссылаться на свое местоположение. Таким образом, notify-send должен быть /usr/bin/notify-send
Все команды должны иметь полный путь.
Используйте команду whereis notify-send, чтобы увидеть, где ваши команды «живут»
Команды должны ссылаться на свое местоположение. Таким образом, notify-send должен быть /usr/bin/notify-send
Все команды должны иметь полный путь.
Используйте команду whereis notify-send, чтобы увидеть, где ваши команды «живут»
Если ваш скрипт в 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)
Я только что получил это, чтобы работать с настольным компьютером 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'
Кажется, что в версии 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.
Команда notify-send не будет отображать сообщение на вашем экране при запуске cron. Просто добавьте целевой экран вверху вашего скрипта, например:
export DISPLAY=:0
В моем случае с ubuntu 16.04 любой явный путь был необходим, я решаю проблему, просто добавляя
DISPLAY =: 0в первых строках crontab, перед вызовом notify- Отправить.
Первым виновником является ваш файл 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"
Способ, которым двоичный код получает адрес dbus, кажется, изменился в последнее время. В Ubuntu 15.04 (Vivid Vervet) с «notify-send 0.7.6» необходимы следующие две переменные:
export HOME=/home/$notify_user
export DISPLAY=:0.0
Оператор «krlmlr» оценивает штраф и устанавливает правильный адрес, но диалог не появится из задания cron.
Если ваш скрипт в 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)
Я только что получил это, чтобы работать с настольным компьютером 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'
Кажется, что в версии 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.
Команда notify-send не будет отображать сообщение на вашем экране при запуске cron. Просто добавьте целевой экран вверху вашего скрипта, например:
export DISPLAY=:0
В моем случае с ubuntu 16.04 любой явный путь был необходим, я решаю проблему, просто добавляя
DISPLAY =: 0в первых строках crontab, перед вызовом notify- Отправить.
Первым виновником является ваш файл 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"
Способ, которым двоичный код получает адрес dbus, кажется, изменился в последнее время. В Ubuntu 15.04 (Vivid Vervet) с «notify-send 0.7.6» необходимы следующие две переменные:
export HOME=/home/$notify_user
export DISPLAY=:0.0
Оператор «krlmlr» оценивает штраф и устанавливает правильный адрес, но диалог не появится из задания cron.