6

test.sh: /usr/bin/notify-send "test"

The following works: bash ~/Documents/test.sh

BUT the crontab never shows the notification. Why?

*/1 * * * * bash ~/Documents/test.sh

pa4080
  • 30,621
membersound
  • 1,460

2 Answers2

10

To execute any GUI related app from Cron you should export few desktop environment variables. The below solution is based on this answer where are provided more details.

How to launch any GUI related application from crontab in Ubuntu 16.04, 17.10, 18.04 and other Ubuntu distributions with Gnome

Create a startup script that will export the desktop environment variables and will launch your application. Let's call it gui-launcher. Its content should be (referencs: [1], [2] and [3]):

#!/bin/bash -e

NAME: gui-launcher

Check whether the user is logged-in

while [ -z "$(pgrep gnome-session -n -U $UID)" ]; do sleep 3; done

Export the current desktop session environment variables

Sometimes it try to change $UID so we must remove -e option or use 2>/dev/null

export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ") 2>/dev/null

Execute the input command

nohup "$@" >/dev/null 2>&1 &

exit 0

  • For other Desktop Environments change gnome-session in this part $(pgrep gnome-session -n -U $UID) with the name of the process of the DE in use, for example mate-session. A list of the most Ubuntu DE is presented here. Lubuntu implementation of the same script - here. The script could be used to launch GUI app from TTY or SSH session in the current user's Desktop session.
  • Make the file executable: chmod +x gui-launcher.
  • The script will work until the user is logged-in, including a locked screen.
  • Please don't modify and run the script as root. It could be harmful for the system!

Then use it within crontab in this way:

*/1 * * * * /full/path/to/gui-launcher "/full/path/to/the-target-application"

Here is how it works on Ubuntu 17.10 on Wayland:

enter image description here


pa4080
  • 30,621
0

Environment for cron and your regular user can be different.

When you're using any scripts in cron better to put full path to them.

Anton
  • 64
  • 2