计划任务:
Linux下面,计划在未来的某一个时刻去执行的任务。
分为两种:一次性的计划任务和周期性的计划任务
一次性的计划任务:at服务,依赖于后台atd进程。
周期性的计划任务:cron服务,依赖于后台crond进程。
at:
1、确认at程序是否安装
# rpm -q at
at-3.1.10-43.el6_2.1.x86_64
# rpm -ql at
/etc/at.deny 用户拒绝列表 /etc/at.allow(默认没有,允许列表)
/etc/pam.d/atd 验证机制
/etc/rc.d/init.d/atd 服务启动脚本
/etc/sysconfig/atd 配置文件
/usr/bin/at 制定一次性的计划任务
/usr/bin/atq 查看
/usr/bin/atrm 删除
/usr/bin/batch 优先级
/usr/sbin/atd 二进制命令
/var/spool/at 存放计划任务文件
2、确认服务是否启动(atd)
# service atd status
atd (pid 5474) is running...
3、通过命令制定一次性的计划任务
命令:
at:
-c:查看计划任务内容
-d:删除计划任务 atrm
-l:列出计划任务
-f:指定文件
man at
时间格式:
at now +1min
at 3:30pm tomorrow
at 15:30
at 07261010
at -t 202010101010
demo1:
# at now +2min
at> echo hello world >/tmp/test.log
at> echo 999 >>/tmp/test.log
at> <EOT> ctrl+d 结束输入
job 1 at 2016-07-25 10:18
# atq
1 2016-07-25 10:18 a root
# at -c 1
....
echo hello world >/tmp/test.log
echo 999 >>/tmp/test.log
demo2:在2分钟以后批量添加2个用户
vim /root/useradd.sh
#!/bin/bash
for i in {1..3}
do
useradd stu$i
done
echo user is ok >>/tmp/test.log
# chmod +x useradd.sh
# at now +1min -f /root/useradd.sh
at服务的用户控制:
/etc/at.deny 拒绝列表
/etc/at.allow 允许列表
1、默认情况下,允许任何人使用at服务
2、如果有at.allow文件,那么只允许在at.allow文件里的人使用;如果at.allow和at.deny冲突,allow优先
周期性的计划任务:cron服务
1、确认cron服务是否安装
# rpm -q cronie
cronie-1.4.4-12.el6.x86_64
# rpm -q crontabs
crontabs-1.10-33.el6.noarch
# rpm -ql cronie|grep etc
/etc/cron.d cron服务的相关目录,存放除了每天/每周/每月以外的计划任务
/etc/cron.d/0hourly 系统每小时需要执行的计划任务
/etc/cron.deny 用户拒绝列表 cron.allow(默认没有,允许)
/etc/pam.d/crond 验证机制
/etc/rc.d/init.d/crond 启动脚本
/etc/sysconfig/crond 配置文件
# rpm -ql crontabs|grep etc
/etc/cron.daily 系统每天需要执行的计划任务
/etc/cron.hourly 每小时
/etc/cron.monthly 每月
/etc/cron.weekly 每周
/etc/crontab 制定系统计划任务的文件
2、确认cron服务是否启动
# /etc/init.d/crond status
crond (pid 2142) is running...
# chkconfig --list|grep crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3、使用cron服务制定周期性的计划任务(系统级别和用户级别)
# cat /etc/crontab
SHELL=/bin/bash 指定默认shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin 命令的相关路径
MAILTO=root 默认发送邮件给root MAILTO=""
HOME=/ 所有相关的命令的主目录
# For details see man 4 crontabs
# 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
# | | | | |
# * * * * * user-name command to be executed
分 时 日 月 周 用户名 命令
周期 用户 命令
,:表示分割 * 10,12 * * * 10点和12点
-:表示一个段 连接 * * 1-5 * * 1号到5号
/n:表示每隔 */5 * * * * 每隔5分钟
* * * * * 每分钟
30 22 * * * 每天晚上10:30
00 05 1,5 * * 每月的1号和5号的凌晨5点整
*/2 * * * 1-5 每周一到周五每隔2分钟
02 8-20/3 * * 0 每周日的8:02 11:02 14:02 17:02 20:02
15 22 1 1 *
00 8-12/2 * * 1,3,5
01 * * * * root run-parts /etc/cron.hourly/
02 04 * * * root run-parts /etc/cron.daily/
22 04 * * 7 root run-parts /etc/cron.weekly/
42 04 1 * * root run-parts /etc/cron.monthly/
run-parts:cron服务使用该工具来执行后面所根的目录里的所有的可执行的脚本文件
demo1:让系统每隔1分钟执行wall命令“hello world”
方法一:
# vim /etc/cron.d/test
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
*/1 * * * * root wall "hello world"
方法二:
vim /etc/crontab
...
*/1 * * * * stu1 id stu2 >>/tmp/test.log
demo2:让系统每小时去执行某个任务
方法一:
vim userdel.sh
#!/bin/bash
for i in {1..3}
do
userdel -r stu$i
done
echo userdel ok >>/tmp/test.log
chmod +x userdel.sh
cp userdel.sh /etc/cron.hourly/
方法二:
vim /etc/crontab
...
*/1 * * * * root run-parts /root
cp test.sh useradd.sh /root
测试验证
问题:
当系统以外宕机,错过了任务执行的时间,怎么办?
anacrontab :是cron服务的一个扩展服务。
cat /etc/anacrontab
..
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
用户级别的计划任务:
crontab命令:
root用户:
crontab -e ——>vi 编辑器
crontab -eu user01 给user01用户制定计划任务
crontab -l 列出root用户的计划任务
crontab -lu user01
crontab -r 删除root用户的计划任务
crontab -ru user01
普通用户:
crontab -e
crontab -l
crontab -r
# export EDITOR=vim 定义调用编辑器
demo1:root
*/1 * * * * echo 88888 >/tmp/test.log
说明:
不需要在计划任务里写用户名,如果写也不会报错,但是不能保证计划任务正常执行
crontab -l
cd /var/spool/cron
ls
demo2:
vim /root/time.sh
#!/bin/bash
ntpdate 192.168.1.2
echo "system date is ok" >>/tmp/test.log
chmod +x time.sh
*/1 * * * * /root/time.sh >/dev/null 2>&1
说明:
周期后面直接跟文件的绝对路径,文件要有可执行权限。
demo3:每隔1分钟stu2给stu1用户发送一封邮件
$ crontab -l
*/1 * * * * mail -s "test" stu1 </etc/hosts
mail -s "test" stu1 </etc/hosts
echo hahahah |mail stu1
cron服务的用户的访问控制:
/etc/cron.deny
/etc/cron.allow
练习:
1、创建2个本地用户test1和test2
useradd test1
useradd test2
2、压缩备份/var/www目录下的所有内容到/www_bak下,叫“当前的系统日期”,即/www_bak/20160715.tar.gz,该工作需要由test1用户完成,并且在工作日(周1-5||单数月||每天||凌晨5点10分)去执行。同时将标准输出和标准错误重定向到/tmp/log中
vim bak.sh
#!/bin/bash
tar -cvzf /www_bak/$(date +%Y%m%d).tar.gz /var/www/*
crontab -eu test1
10 05 * 1,3,5,7,9,11 1-5 /bin/bash /tmp/bak.sh >/tmp/log 2>&1
3、系统只允许test1用户使用cron服务,不允许test2用户使用
echo test1 >/etc/cron.allow
su - test1
crontab -e
30 01 * * 1 bak1.sh
30 01 * * 2 bak1.sh
30 01 * * 3 bak0.sh
30 01 * * 4 bak1.sh
30 01 * * 5 bak1.sh
30 01 * * 6 bak1.sh
30 01 * * 7 bak0.sh
系统日志:
rhel5 syslog
rhel6 rsyslog 支持日志写入到数据库、支持队列、模块化
1、确认软件是否安装
# rpm -q rsyslog
rsyslog-5.8.10-8.el6.x86_64
# rpm -ql rsyslog|grep etc
/etc/logrotate.d/syslog 日志轮巡文件
/etc/pki/rsyslog
/etc/rc.d/init.d/rsyslog 启动脚本
/etc/rsyslog.conf 主配置文件
/etc/rsyslog.d 相关主目录
/etc/sysconfig/rsyslog 额外配置文件
/sbin/rsyslogd 二进制命令
2、确认服务是否启动
# chkconfig --list|grep rsyslog
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# service rsyslog status
rsyslogd (pid 1594) is running...
3、通过修改配置文件来完成服务日志配置
配置文件里相关符号:
. 用来分割服务和级别
* 任何服务或任何级别
= 有=代表等于某一个日志级别;没有=代表大于等于某个日志级别
! 排除操作,只有前面两个相同服务时才有意义
; 用于分割"服务.日志级别"
, 用来分割不同的服务
日志级别:
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
none:不是一个日志级别,代表不记录日志
0:系统不可用
1:特别需要留意的非常严重的信息
2:相对较严重的信息
3:错误信息
4:警告信息
5:正常的需要留意的信息
6:正常的输出信息 info
7:调试信息
cron.info cron服务的大于等于info级别的日志
mail.=err mail服务的等于err级别的日志
*.warring 任何服务的大于等于warring级别的日志
cron.info;mail.err
cron,mail.=err
cron.info;cron.!=err
0123456 0124567 012456
cron.info;cron.!err
0123456 4567 456
# cat /etc/rsyslog.conf |grep -v ^#|grep -v ^$
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
本地日志管理:
demo1:记录所有服务的大于等于debug信息日志
1、修改配置文件
vim /etc/rsyslog.conf
#all servicexxxx
*.debug /var/log/debug
2、重启服务
service rsyslog restart
3、测试验证
cat /var/log/debug
Oct 10 01:41:52 vm01 kernel: imklog 5.8.10, log source = /proc/kmsg started.
Oct 10 01:41:52 vm01 rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="13819" x-info="http://www.rsyslog.com"] start
Oct 10 01:42:01 vm01 CROND[13829]: (root) CMD (/root/time.sh >/dev/null 2>&1)
demo2:指定mail服务的日志到某个文件
vim /etc/rsyslog.conf
mail.info /var/log/testmaillog
service rsyslog restart
测试:
# echo 8888 |mail -s test stu1
# logger -t "test log" -p mail.info test mail log
# tail -f testmaillog
Oct 10 01:44:58 vm01 postfix/pickup[13077]: AA17F44BFB: uid=0 from=<root>
Oct 10 01:44:58 vm01 postfix/cleanup[13886]: AA17F44BFB: message-id=<20201009174458.AA17F44BFB@vm01.uplooking.com>
Oct 10 01:44:58 vm01 postfix/qmgr[2117]: AA17F44BFB: from=<root@vm01.uplooking.com>, size=442, nrcpt=1 (queue active)
Oct 10 01:44:58 vm01 postfix/local[13888]: AA17F44BFB: to=<stu1@vm01.uplooking.com>, orig_to=<stu1>, relay=local, delay=0.04, delays=0.03/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Oct 10 01:44:58 vm01 postfix/qmgr[2117]: AA17F44BFB: removed
Oct 10 01:46:17 vm01 test log: test mail log
demo3:自定义管理ssh服务的日志
1、修改ssh服务的主配置文件
# vim /etc/ssh/sshd_config
SyslogFacility local1
# service sshd restart
2、修改rsyslog服务的主配置文件
vim /etc/rsyslog.conf
local1.info /var/log/ssh
# service rsyslog restart
3、测试验证
client:192.168.1.3
#ssh 192.168.1.102
# tail -f ssh
Oct 10 01:53:39 vm01 sshd[14036]: Accepted password for root from 192.168.1.3 port 35744 ssh2
Oct 10 01:54:07 vm01 sshd[14059]: Accepted password for root from 192.168.1.140 port 55648 ssh2
Oct 10 01:54:11 vm01 sshd[14059]: Received disconnect from 192.168.1.140: 11: disconnected by user
远程日志管理:
client:192.168.1.3
server:192.168.1.102
思路:
server:rsyslog软件已安装、服务起来、打开监听(514)
client:rsyslog软件、服务起来、配置日志传送的远程服务器
server:192.168.1.102
1、修改配置文件
vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
2、重启服务
service rsyslog restart
3、查看514端口是否处于监听状态
# netstat -nlup|grep :514
udp 0 0 0.0.0.0:514 0.0.0.0:* 14343/rsyslogd
udp 0 0 :::514 :::* 14343/rsyslogd
client:192.168.1.3
1、修改配置文件
vim /etc/rsyslog.conf
*.* @192.168.1.102:514
2、重启服务
3、测试验证
# logger -it test "test test test log"
默认情况下,会放到192.168.1.102server端的/var/log/messages
demo2:将client上的ssh服务的日志远程传送到server端/var/log/ssh1文件里
思路:
1、server端开启514端口并且指定该日志文件存放在哪里
2、client指定将ssh服务的日志传送给server端,同时需要指定ssh服务的日志设备
server:192.168.1.102(日志集中管理服务器)
1、修改配置文件
vim /etc/rsyslog.conf
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
local2.* /var/log/ssh1
2、重启服务
# service rsyslog restart
client:192.168.1.3
1、修改ssh服务的主配置文件
vim /etc/ssh/sshd_config
...
SyslogFacility local2
重启ssh服务
service sshd restart
2、修改rsyslog.conf配置文件
vim /etc/rsyslog.conf
local2.* @@192.168.1.102:514 @代表UDP协议 @@代表TCP协议
重启rsyslog服务
service rsyslog restart
测试验证:
验证机器:192.168.1.2
ssh 192.168.1.3
server:192.168.1.102(日志管理服务器)
# tail -f /var/log/ssh1
Jul 25 17:13:41 node1 sshd[6827]: Accepted password for root from 192.168.1.2 port 50004 ssh2