概述

Fcron是一款调度程序,目的是取替Vixie Cron和anacron.它被设计成可以运行来非连续工作的系统上,同时还包含其他特性,分配任务有限级,序列化控制发送邮件等功能.
具体内容可以查看help或者项目首页

安装

emerge fcron
调度管理程序有多种选择,如果已经安装其他程序(dcron,cron,vixie-cron等等)可能会与fcron有冲突.

配置

fcron是守护进程
fcrontab 是用户配置调度任务的主程序

编辑当前用户的任务

fcrontab -e 

用户必须在users组,root也一样

列出当前用户的任务

fcrontab -l

语法实例

语法1

@选项 频率 命令

参数 含义
m
w
d
h 小时
s

每个30分钟获取所有邮件

@ 30 getmails -all

每隔2天进行一次系统检测,并强制把结果用邮件发送到root,即时没有内容

@mailto(root),forcemail 2d /etc/secruity.sh

语法2

&选项 分钟 小时 天 月 周 命令

参数 含义
分钟 0-59
小时 0-23
1-31
1-12
0-6 0代表周日
- 范围 3-5表示3,4,5
~ 不包括某个值
, 和 3,5表示3和5
/ 间隔某个值 /5 间隔5
* 全部

在12:05 12:35 13:05 13:35 14:05:14:35 运行我的命令

&05,35 12-14 * * * mycommand 

在每小时的20,21,22和24分获取邮件

20-24~23 * * * * getmaill

每隔10分钟执行一次mycommand

/10 * * * * mycommand

只要不是周日,以一个较低的优先级在每晚的03:45保存我的工作,并把结果用邮件发送给user1.
如果任务的时间段没有开机,则在下次开机登录后马上执行 bootrun

&nice(10),mailto(user1),bootrun 45 03 * * *~0 save-work

nice可以取值(-20到19),但是只有root可以取负值
bootrun会确保如果任务在系统关键时被错过了,那么在重新开机登录后马上被执行
fcron内部也会维护任务是否执行的状态,是根据任务执行的命令区分任务的

&bootrun 0 12 * * 1 /path/of/script.sh

每周一 12点执行脚本,如果错过这个时间,会在下次启动时立即执行.

语法3

%选项 分钟 小时 天 月 周 命令

hourly,daily,monthly,weekly
这些关键字控制当前任务,在可选的任务时间区间内只执行一次

关键字 后边必须跟的字段
hourly,midhourly: minutes
daily, middaily, nightly, weekly, midweekly: minutes 和 hours.
monthly, midmonthly: minutes, hours 和 days.

ly的选项是每[小时,天,夜晚,周,月]
mid
ly则是代表这个时间的中间,nightly相当与middaily

每晚21:00到23:59 或者 3:00到5:59 (会尽可能快运行)执行一次任务,把命令结果发送邮件(no代表不发送)

%nightly,mail(no) * 21-23,3-5 echo "a nigthly entry"

fcron还包含大量内置设置选项,具体可以查看帮助

X程序调用

每分钟显示气泡

* * * * * export DISPLAY=:0.0 notify-send "hello"

如果cron 不能显示气泡,可能是cron无法访问DBUS_SESSION_BUS_ADDRESS环境变量

#!/bin/bash
touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus

a=`env|grep DBUS_SESSION_BUS_ADDRESS`
echo "$a" > $HOME/.dbus/Xdbus
echo "export DBUS_SESSION_BUS_ADDRESS" >> $HOME/.dbus/Xdbus


if [ -r $HOME/.dbus/Xdbus ];then
source $HOME/.dbus/Xdbus
fi

#a=`env|grep DBUS_SESSION_BUS_ADDRESS`
#DBUS_SESSION_BUS_ADDRESS=`echo $a|sed 's/DBUS_SESSION_BUS_ADDRESS=//g'`
export DBUS_SESSION_BUS_ADDRESS
export DISPLAY=:0.0
notify-send hello   

chmod +x /bin/script1.sh

DBUS_SESSION_BUS_ADDRESS变量每次登录值会改变,需要重新生成Xdbus文件,暂时没找到正确的自动化方法