2

I've got a script that works perfectly when I run it as myself on the command line but when the script is run by incron the line that copies a value to the clipboard doesn't work. Basically I'm using incron to monitor the addition of a new file in a particular directory then upload that file to an FTP server and copy the URL to the clipboard. This is the line that fails (seemingly does nothing) when the script is run by incron:

echo -n $URL | xclip -selection clipboard

My guess is that incron doesn't have access to the clipboard in the same way that I do as a logged in user, but I don't know what to do about it. Any help would be awesome.

3
  • 1
    The most common problem with cron is that cron runs with a minimal shell and minimal environmental variables. As such you have to use the full path to binaries (/usr/bin/xclip for example).
    – Panther
    Jun 10, 2015 at 3:59
  • Is there a specific reason to do it (whatever it is) via the clipboard? Why not let a script handle whatever is the follow up? Jun 10, 2015 at 7:02
  • I wanted to monitor a folder so I could drop a new file in the folder and the file would be automatically uploaded to my website with the URL to the file in the clipboard so I could easily copy/paste the URL into a chat or email or whatever. Thanks so much for the help!
    – Lee
    Jun 10, 2015 at 19:37

1 Answer 1

2

xclip is an application that needs environment variables such as $XAUTHORITY and $DISPLAY to talk to the X11-server. You can create a cronjob the looks as follows:

/bin/su your_username -c "export XAUTHORITY='/home/your_username/.Xauthority'; export DISPLAY='$(strings /proc/$(pgrep -n Xorg)/environ | awk -F== '$1 ~ "DISPLAY"{print $2}')'; echo -n "message" | xclip -selection clipboard"

Use your own username instead of your_username. It is a long line, but cron doesn't accept multiple lines as cronjob entries. However, here is what it does:

  • /bin/su your_username: it switches the user
  • -c "...": and runs the command in the quotes
  • export XAUTHORITY='...';: first we need the $XAUTHORITY variable
  • export DISPLAY='...': and the $DISPLAY variable, this is mostly :0, but if not, we can get the variable from the environment of the Xorg process
  • echo ... | xclip ...: finally run the desired command within that environment. No need to use absolute paths anymore because we have a minimal environment now.
4
  • This is excellent information! Thank you! I put this line at the top of the screen and it started working. export DISPLAY=:0.0
    – Lee
    Jun 10, 2015 at 19:35
  • 1
    @Lee Then accepting the answer is the appropriate way to indicate it works for you :) Jun 10, 2015 at 19:39
  • Doh! Sorry about that. This was my first question I've ever asked. #embarrassed
    – Lee
    Jun 10, 2015 at 23:36
  • Didn't work for me, so I put my script in sudo crontab -e (root crontab) and had it only the following content: export XAUTHORITY='/home/username/.Xauthority'; export DISPLAY=:0.0; command, xclip, program etc. Reason: the xorg thingy doesnt work for me, so I replaced it with my actual $DISPLAY variable and su wouldnt work in a user-crontab, so I got rid of it and ran it as a root crontab in the first place. thanks for your answer
    – phil294
    Nov 28, 2016 at 1:38

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .