2

On my system, notify-send requires 3 enviorment variables to run, which are kept in a file which is generated automatically on logon:

/home/anmol/.env_vars:

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-PwezoBTpF3
export DBUS_SESSION_BUS_ADDRESS
XAUTHORITY=/home/anmol/.Xauthority
export XAUTHORITY
DISPLAY=:0
export DISPLAY

And, in the crontab buffer, I have entered this:

PATH=/home/anmol/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

* * * * *  /home/anmol/display-notif.sh

where display-notif.sh contains:

#!/usr/bin/env bash

. /home/anmol/.env_vars
notify-send 'hello'

Although I am able to run notify-send from non-sudo cron (crontab -e) through this setup, I am unable to do so from sudo cron (sudo crontab -e).

I also tried checking if there are any errors being generated:

* * * * *  /home/anmol/display-notif.sh 2>/home/anmol/log

But that log file is empty.

How do I make it work from sudo cron ?

I am using Ubuntu 16.04.

  • What are you trying to do? Why would you want to use sudo here? is root running their own X session? If not, if you just want to connect to your own X session, sudo is not needed. Also, note that you don't need to declare the variables and export them later, you could just write export DISPLAY=:0. – terdon Jun 12 '16 at 14:45
  • @terdon I'm doing this because I'm actually running some other command from root crontab, and I want to display notification whenever that command runs. – Anmol Singh Jaggi Jun 12 '16 at 14:47
  • OK. Does it work if you run xhost + from your normal user's session before the root crontab runs? – terdon Jun 12 '16 at 14:51
  • No. It does not. – Anmol Singh Jaggi Jun 12 '16 at 16:07
  • Is your home directory encrypted, or more precisely, what filesystem type is your home directory on? Try running the script from a root prompt in a terminal, it may be easier to see error messages. – Gilles 'SO- stop being evil' Jun 12 '16 at 20:31
  • No, it isn't encrypted, and it is the default ext4. I executed sudo ./display-notif.sh and got no error whatsoever. notify-send doesn't have good error-logging it seems. – Anmol Singh Jaggi Jun 12 '16 at 20:37

2 Answers2

3

This function ( from https://unix.stackexchange.com/a/344377/7286 ) works for me in Ubuntu 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 
}
mivk
  • 3,596
0

It is working after replacing

* * * * *  /home/anmol/display-notif.sh

with

* * * * *  sudo -u anmol /home/anmol/display-notif.sh
Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
  • This negates the requirement to run the job as root, by having it run as the original user. At this point you might as well have not run it as root in the first place – Chris Davies May 08 '21 at 07:25