Reputation: 59
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
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
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
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
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
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
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