Tomas
Tomas

Reputation: 59

Cron xdotool doesn't run

I am new to using crontab, and I've been trying to get a simple cron job. I want press F5 every 1 minute to refresh Mozzila Firefox. I am using xdotool for press F5. I have script /usr/local/bin/refresh.sh:

#!/bin/bash  
xdotool search --name "Mozilla Firefox" key F5

If i run it in command line it works fine. And permission:

-rwxr-xr-x. 1 root root 89 15. čec 10.32 refresh.sh

In crontab i have:

*/1 * * * * cd /usr/local/bin && sh refresh.sh

But script run by cron doesnt work. Can anyone tell me what i do wrong?

Upvotes: 6

Views: 9534

Answers (6)

PickleRick
PickleRick

Reputation: 21

Ubuntu 23.04

I wanted to run xdotool get_desktop and was getting Error: Authorization required, but no authorization protocol specified, Can't open display: (null)

Instead of just getting the DISPLAY, I also needed to get the XAUTHORITY (it was NOT /root/.Xauthority)

echo $DISPLAY
echo $XAUTHORITY

The fix was

export DISPLAY=<what you got from the $DISPLAY> && export XAUTHORITY=<what you got from @XAUTHORITY> && xdotool get_desktop

Example:

export DISPLAY=:0 && export XAUTHORITY=/run/user/1000/.mutter-Xwaylandauth.LYZR61 && xdotool get_desktop

Upvotes: 0

Paulo Ricardo
Paulo Ricardo

Reputation: 79

If someone wants to schedule xdotool commands with different tool, It is possible with At command (see the tutorial). So, in order to work, you must define the environment variable DISPLAY (as explained by Kenorb). I first got the current value from that variable (echo $DISPLAY) in order to set in my script file (export DISPLAY=:0). Then, it can be ran like:

at xx:xx -f your_shell_script_file

Upvotes: -1

aris melachroinos
aris melachroinos

Reputation: 180

First as Parth said, make sure to type echo $DISPLAY on a terminal and get the output (for me it was :10.0 for some reason). Then inside the script that you are calling from cron, before you call xdotool, write the following:

export DISPLAY=:10.0 

#instead of :10.0 write your own output from before

export XAUTHORITY=/root/.Xauthority  

#if you are not a root user, instead of /root/.Xauthority write ~/.Xauthority

Upvotes: 2

Parth Mehrotra
Parth Mehrotra

Reputation: 3040

So I tried a bunch of things, but for some reason on Ubuntu 18.04 echo $display returned :1 not :0. Also the only environment variable setter that seemed to work was adding:

export DISPLAY=":1"

directly to the script that cron is running.

Upvotes: 2

kenorb
kenorb

Reputation: 166755

The xdotool command is automation tool for X11 which allows you simulate keyboard/mouse input, but since crontab is run independently, it's required to define DISPLAY variable to specify which X Window System display server to use. Normally when you're login to the desktop this variable is assigned automatically, but crontab is running jobs in isolated environment (doesn't have even a tty associated), especially when you run commands via root account.

So in short, you should do define your job like:

*/1 * * * * DISPLAY=:0 /usr/local/bin/refresh.sh

Or you can define variables at the beginning of the file (in case of Vixie cron). See: Variables in crontab?

Also make sure the user which is running the job has granted access to the selected X display. If you need to grant the access, you need to assign the permission via xhost and setfacl commands and specify extra XAUTHORITY variable, see: Xdotool using “DISPLAY=:0” for more details.

Upvotes: 10

sjsam
sjsam

Reputation: 21965

Why not

*/1 * * * * /usr/local/bin/refresh.sh

cd /usr/local/bin is not necessary here as you're not running the cron job in /usr/local/bin

You need cd in below scenario

*/1 * * * * cd /usr/local/bin && ls >/var/somelog # wish to execute ls in a particular directory

Upvotes: 0

Related Questions