当我们需要一些自动定时提醒或者每天下班自动执行备份,定期自动重启某些服务清理某些缓存时,如何在大Linux上使用几句shell命令完成实现这份任务的自动化呢? notify-send和crontab的结合就可以轻松实现定时执行,自动弹出通知提醒等。
程序包libnotify-bin为X桌面系统提供了向桌面发送通知的功能,Ubuntu 9.04之后已经自带该功能,其它Linux发行版根据具体情况先安装,ubuntu安装示例:
apt-get install libnotify-bin
使用notify-send命令介绍如下(man notify-send命令查看):
http://manpages.ubuntu.com/manpages/gutsy/man1/notify-send.1.html
notify-send "NotifyTest" "I am a test notification."
notify-send "Notification Title" "The message body is shown here" -i /home/jokerlee/icon.png -t 1000
使用NotifyOSD定制Ubuntu 14.04的通知行为,打造更酷炫多样的通知形式
参考> http://imcn.me/html/y2014/19785.html
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的任务计划表。
crontab -r : 删除目前的任务表
crontab -l : 列出目前的任务表
crontab -e : 执行文字编辑器来设定任务表
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
有时我们加入crontab内的任务无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
例如工作日每天十点提醒到OA系统去做一些签到预订什么的例子如下:
* 10 * * 1-5 . /home/jokerlee/notify_dinner
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)"
export DISPLAY=:0
因为执行GUI程序需要提供DISPLAY环境变量,而ubuntu 14.04根据资料还需要提供DBUS_SESSION_BUS_ADDRESS environment variable
具体原因可以查看stack overflow上大神的回答 > http://askubuntu.com/questions/298608/notify-send-doesnt-work-from-crontab/346580#346580
PS:
crontab新增的任务需要重启cron服务才会立即生效
ubuntu重启命令:
sudo service cron restart
sudo /etc/init.d/cron start
更多发行版的cron服务启动> http://www.cyberciti.biz/faq/howto-linux-unix-start-restart-cron/
cron服务执行每一条任务都会将输出信息通过电子邮件的形式发送给当前系统用户或者记录在系统日志/var/log/syslog(ubuntu 14.04,同样查看该文件可以知晓加入的定时任务是否正常按时运行),这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
可以在crontab文件中设置如下形式,忽略日志输出:
0 /3 * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
crontab更详细的使用介绍:
http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html
notify-send与inotify的结合使用:
http://www.baozy.com/archives/12084.html