37

I would like to set up a scheduled task via anacron but I would like to do so in user mode. How can I achieve this?

Glutanimate
  • 21,183
  • 13
  • 100
  • 153
  • 2
    If you want the task to run in user mode, you can do what i did and just prepend `sudo -u ` before the task in `anacrontab` – Karthik T May 20 '14 at 14:34
  • 2
    Also answered here: http://serverfault.com/questions/172989/user-specific-anacrontab/172994 and here's a nice fully written up solution: http://akeil.net/posts/user-controlled-anacron.html – Simon Woodside Aug 17 '16 at 03:33
  • This answer is very simple: https://askubuntu.com/a/1105580/132783 Just switch to the user inside the anacron specific job. – Gorka Oct 04 '22 at 07:47

3 Answers3

54

You can set up a separate anacron instance to run in user mode:

  1. Create a .anacron folder in your home directory and in it two subfolders, etc and spool:

    mkdir -p ~/.anacron/{etc,spool}
    
  2. Create a new file ~/.anacron/etc/anacrontab with contents similar to the following:

    # /etc/anacrontab: configuration file for anacron
    
    # See anacron(8) and anacrontab(5) for details.
    
    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    # period  delay  job-identifier  command
    1         10     testjob         test.sh
    
  3. Add the following line to your crontab using crontab -e:

    @hourly /usr/sbin/anacron -s -t $HOME/.anacron/etc/anacrontab -S $HOME/.anacron/spool
    
dessert
  • 39,392
  • 12
  • 115
  • 163
Glutanimate
  • 21,183
  • 13
  • 100
  • 153
  • Just to confirm, this runs the specified script as the user, so a `whoami` in the script will give the user name? – Christoph Mar 02 '14 at 19:50
  • hm yeah, on further inspection I don't see why not... – Christoph Mar 02 '14 at 20:12
  • 3
    I think you need to run `anacron` periodically; it seems to run once then quit. The system's anacron is called once every hour. I suppose a similar strategy would work here, i.e. call the user `anacron` from the user `crontab`. – Sparhawk Nov 03 '15 at 03:00
  • 1
    @Sparhawk agreed, in particular Ubuntu 15.10 anacron uses both `/etc/apm/event.d/anacron` and `/etc/init/anacron.conf` to take care of restarts. – Ciro Santilli OurBigBook.com Dec 09 '15 at 21:53
  • 1
    You need to run anacron hourly with a cron job, e.g. `01 * * * * /usr/sbin/anacron -t /home/user/.anacron/etc/anacrontab -S /home/user/.anacron/spool` – Simon Woodside Aug 17 '16 at 05:15
  • 1
    This won't work if the user has an encrypted home directory. I've replaced that last `crontab -e` command with an entry in my `~/.profile` instead. – Razor Jul 24 '20 at 05:05
  • @Razor but my `.profile` entry didn't get me anywhere: `anacron` didn't run at login. I had to `sudo` everytime to do this, requiring my password – stucash Dec 18 '21 at 09:43
  • 1
    @Glutanimate thank you for this! It has been driving me crazy for a long time. – telometto Jan 14 '22 at 12:44
0

The anacrontab shown above has a problem: anacron looks for executables only in the directories specified in PATH. So it will not find test.sh.

A better solution is to use the command run-parts:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# period  delay  job-identifier  command
1         10     dailyjob        run-parts ${HOME}/.anacron/daily/

This requires that we create the directory daily:

mkdir -p ~/.anacron/{etc,spool,daily}

run-parts will not execute scripts with '.' in the name, such as "test.sh", so rename the script to, for example, "my-test".

There is yet another wrinkle: If the computer does not run 24/7, then one does not have control over at what time the daily script is run. I have a web scraping script that I want to be run at about 11 am, or later during the day. I fix this problem by scheduling the web scraping job in the "at" facility (sudo apt install at).

So I have a script daily/crawl which looks as follows:

#!/bin/bash

preferred_time="11:15"
scheduled_time="${preferred_time}"
preferred_time_as_number="${preferred_time/:/}"
current_time_as_number=$(date +%H%M)
if [ "${current_time_as_number}" -ge "${preferred_time_as_number}" ]; then
    scheduled_time="NOW"
fi
at -M -f "${HOME}/bin/crawl-dagpris.sh" "${scheduled_time}"
0

This worked for me (thanks), but I didn't use the last step given in the answer:

Then add the following line to your ~/.profile:

I'm using Ubuntu Studio 12.10 Quantal and in my case instead of that last step I put that one liner here: “Applications Menu” → “Settings” → “Settings Manager” then in the Settings Manager under “Session and Startup” then the “Application Autostart” tab.

This is for those of us that are GUI users, because ~/.profile is only sourced by bash when it starts a log-in interactive shell (even ~/bashrc is not so useful since that is only sourced when bash is starting an interactive shell).

Martin Ueding
  • 8,218
  • 11
  • 52
  • 83
sam
  • 1