如何在用户模式下运行anacron?

我想通过 anacron 设置一个定时任务,但我希望在用户模式下进行。我该如何实现这个目标?

2如果你想让任务在用户模式下运行,你可以像我一样,在anacrontab中的任务前面加上sudo -u <user> - Karthik T
2这里也有答案:http://serverfault.com/questions/172989/user-specific-anacrontab/172994,这里还有一个完整的解决方案:http://akeil.net/posts/user-controlled-anacron.html。 - Simon Woodside
这个答案非常简单:https://askubuntu.com/a/1105580/132783 只需在anacron特定的任务中切换到用户。 - Gorka
3个回答

您可以设置一个单独的anacron实例以在用户模式下运行:
  1. 在您的主目录中创建一个名为.anacron的文件夹,并在其中创建两个子文件夹:etcspool

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

  3. 创建一个名为~/.anacron/etc/anacrontab的新文件,内容类似于以下内容:

  4. # /etc/anacrontab: anacron的配置文件
    
    # 有关详细信息,请参阅anacron(8) 和 anacrontab(5)。
    
    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
    

  5. 使用crontab -e将以下行添加到您的crontab中:

  6. @hourly /usr/sbin/anacron -s -t $HOME/.anacron/etc/anacrontab -S $HOME/.anacron/spool


只是为了确认一下,这将以用户身份运行指定的脚本,所以脚本中的 whoami 命令会返回用户名称? - Christoph
嗯,经过进一步的检查,我看不出为什么不可以... - Christoph
3我认为你需要定期运行anacron;它似乎只运行一次然后退出。系统的anacron每小时调用一次。我想在这里使用类似的策略,即从用户的crontab中调用用户的anacron - Sparhawk
1@Sparhawk同意,特别是Ubuntu 15.10的anacron使用/etc/apm/event.d/anacron/etc/init/anacron.conf来处理重启。 - Ciro Santilli OurBigBook.com
1你需要使用cron任务每小时运行anacron,例如 01 * * * * /usr/sbin/anacron -t /home/user/.anacron/etc/anacrontab -S /home/user/.anacron/spool - Simon Woodside
1如果用户的主目录被加密了,这个方法就行不通了。我把最后那个crontab -e命令替换成了我的~/.profile文件中的一个条目。 - Razor
@Razor 但是我的.profile条目没有起作用:anacron在登录时没有运行。我每次都需要使用sudo来执行此操作,需要输入密码。 - stucash
1@Glutanimate 谢谢你!这个问题困扰了我很长时间。 - telometto

这对我有用(谢谢),但我没有使用答案中给出的最后一步:
然后将下面这行添加到您的〜/ .profile中:
我正在使用Ubuntu Studio 12.10 Quantal,在我的情况下,我没有使用最后一步,而是在这里放了一个单行代码:“应用程序菜单”→“设置”→“设置管理器”,然后在“会话和启动”下的“应用程序自启动”选项卡中。
这是针对我们GUI用户的,因为〜/ .profile仅在bash启动登录交互式shell时由bash引用(即使〜/ bashrc也不太有用,因为只有在bash启动交互式shell时才会被引用)。

嗯,我自己是一个图形用户界面的使用者,在.profile文件中的那行命令对我来说一直都很好用(我在这里使用的是Ubuntu 12.04)。 - Glutanimate

上面显示的anacrontab有一个问题:anacron只会在PATH指定的目录中查找可执行文件。因此,它无法找到test.sh。
更好的解决方案是使用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/

这要求我们每天创建目录。
mkdir -p ~/.anacron/{etc,spool,daily}

run-parts不会执行带有'.'的脚本名称,比如"test.sh",所以将脚本重命名为"my-test"。

还有另一个问题:如果计算机没有全天运行,那么就无法控制每天脚本运行的时间。我有一个网页抓取脚本,我希望它在上午11点左右或者白天晚些时候运行。我通过在"at"工具中安排网页抓取任务来解决这个问题(sudo apt install at)。

所以我有一个名为daily/crawl的脚本,内容如下:

#!/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}"