Mail、计划任务
mail 命令
基本语法(mail进去后):
h 显示当前的邮件列表
l 显示当前支持的命令列表
d 删除当前邮件, d 1-100 删除第1到100封邮件
file 显示整个用户邮件存放路径和邮件总数
fn 指针跳转到第n封邮件上,例如f13 跳转到第13封邮件
t 阅读某一封邮件,例如t22 阅读第22封邮件
top 查看当前指针所在邮件的邮件头
? 查看命令参数用法
mail 写邮件
n 阅读某一封邮件,例n9看第9封,只输n的话,查看当前指针的下一封邮件
q 退出
4种使用方式:
1. mail 进入交互式收发邮件接口,再输入mail编辑邮件
2. mail -s ‘主题’ username@hostname 编辑邮件内容,CTRL+D或.结束
3. mail -s ‘主题’ username@hostname < /PATH/file 文件重定向方式
4. echo “hello” | mail -s ‘主题’usernaem@hostname 管道方式
邮件存放位置:
/var/spool/mail/username
at 命令(需要atd守护进程里面任务的命令建议使用绝对路径,因为命令执行与PATH有关)
命令参数:
-l 查看待运行作业队列,相当与atq
-f 读取待运行命令列表 例at-f at.list 14:30 (at.list为命令列表或脚本)
-c 查看待运行作业的内容(运行环境、配置等) 例:at -c 2
-m 当任务完成时,即使没有输出信息,也以email行驶通知用户
例:-m at now + 3day
命令格式:
HH:MM 例:at 22:00
HH:MM YYYY-MM-DD 例:at 22:00 2015-09-05
HH:MM [am|pm] [month] [date] 例:at 04pm march 17
HH:MM [am|pm] + number[minutes|hours|days]
例:at now + 3days 或at04pm + 3days
batch: 由系统自行选择在资源较为空闲时运行指定的任务,命令格式和at一样
crontab:周期性任务计划,它需要运行一个守护进程:crond
参数:
-u 指定用户名,建立该用户的任务
-e 编辑
-l 查看任务
-r 删除所有任务
格式:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6)(Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
分,小时,日,月,周
特殊符号:* 任何时刻都接受
,代表分隔时段的意思。例:执行3:00与6:00是0 3,6 * * * command
- 代表一段时间范围。例:8到12点之前没小时的20分进行一项工作
208-12 * * *
/n n代表数字,每隔n单位间隔,例:每5分钟执行一次,*/5 * * * *
/etc/cron.allow,/etc/cron.deny
计划任务技巧:
由于crontab只能精确到分钟,如果要实现秒级任务,有2种方法实现:
1. 通过sleep命令,只要能被60整除的数(间隔秒数)都可以实现。如果间隔的秒数太少,例如2秒执行一次,这样就需要在crontab 加入60/2=30条语句。不建议使用此方法
例:要求每20秒钟执行一次cat/etc/fstab
crontab -e 添加:
* * * * * /usr/bin/cat /etc/fstab
* * * * * sleep 20;/usr/bin/cat /etc/fstab
* * * * * sleep 20;/usr/bin/cat /etc/fstab
例2:
*/1 * * * * sh /root/cron.sh
*/1 * * * * sleep 30 && sh/root/cron.sh
# 每分钟执行两次 每隔30秒执行一次
2.通过循环语句实现
例:
crontab-e
* * ** * source cron.sh
cron.sh如下:
while true;do
sleep 3;
命令
done
每3秒就循环一次,要注意的是,这个是死循环脚本
crontab 中执行多个命令的方法:
方法1:
*/30* * * * bin/sh /home/xyw/task1.sh
*/30* * * * bin/sh /home/xyw/task2.sh
方法2
*/30* * * * bin/sh /home/xyw/task1.sh; bin/sh /home/xyw/task2.sh
方法3
*/30* * * * bin/sh /home/xyw/task1.sh && bin/sh /home/xyw/task2.sh
方法4
*/30* * * * bin/sh /home/xyw/task1.sh || bin/sh /home/xyw/task2.sh
crontab中特别要注意的!!!!!
1. crontab与环境变量
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
exportRUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh-c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * ./etc/profile;/bin/sh/var/www/java/audit_no_count/bin/restart_audit.sh
2. 其他应该注意的问题
1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
4)千万别乱运行crontab-r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。