08、启动过程+at+crond+anacron

此生再无相见时 提交于 2019-11-26 19:38:18
--
 
[root@li ~]# 加电--BIOS (basic input output system)--以什么设备来启动--/dev/sda -- mbr -- grub.conf --vmlinux and initramfs -- init -- /etc/inittab -- /etc/fstab -- /etc/rc.sysinit -- ls /etc/rcx.d -- /etc/rc.local  --登录
 
系统引导程序 grub (就是一个boot loader)
 
Grand Unified Boot Loader
 
 
[root@li ~]# rpm -qa |grep grub
grub-0.97-13.5
[root@li ~]# rpm -qi grub-0.97-13.5
 
Summary     : GRUB - the Grand Unified Boot Loader.
Description :
GRUB (Grand Unified Boot Loader) is an experimental boot loader
capable of booting into most free operating systems - Linux, FreeBSD,
NetBSD, GNU Mach, and others as well as most commercial operating
systems.
 
 
[root@li ~]# ls /boot/grub/ --相关的配置文件在/boot/grub目录下
device.map         iso9660_stage1_5   stage1
device.map.backup  jfs_stage1_5       stage2
e2fs_stage1_5      menu.lst           ufs2_stage1_5
fat_stage1_5       minix_stage1_5     vstafs_stage1_5
ffs_stage1_5       reiserfs_stage1_5  xfs_stage1_5
grub.conf          splash.xpm.gz
 
# ll /etc/grub.conf --是一个软链接文件
lrwxrwxrwx 1 root root 22 Jun  3  2011 /etc/grub.conf -> ../boot/grub/grub.conf
 
 
diff是按行去进行对比不同
[root@li vm]# diff /etc/grub.conf /boot/grub/grub.conf
 
 
md5sum使用md5校验文件完整性,也可以对比两个文件
 
[root@li vm]# md5sum /etc/grub.conf
37b9c539c0c4320fd297cd89ea6497ad  /etc/grub.conf
[root@li vm]# md5sum /boot/grub/grub.conf
37b9c539c0c4320fd297cd89ea6497ad  /boot/grub/grub.conf
 
 
 
# vim /boot/grub/grub.conf
# vim /etc/grub.conf      --这个是链接文件,这两个文件修改一个,两个都会变
default=0 --默认进入第一个系统
timeout=5 --5秒钟不选择,则进入默认default指定的系统;如果改为-1表示等待时间无限
splashimage=(hd0,0)/grub/splash.xpm.gz  --指定grub背景图的路径;(hd0,0)表示的就是/dev/sda1,所以这个路径其实就是指/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
        root (hd0,0) --表示/dev/sda1,也就是/boot
        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet  --vmlinuz是/boot分区下的,名字不能错;root=LABEL=/是启动时要知道根分区是谁;这里写的是标签。但可以替换成/dev/sdax
        initrd /initrd-2.6.18-164.el5.img  --initrd的路径
 
[root@li ~]# cat /boot/grub/device.map
(fd0)   /dev/fd0
(hd0)   /dev/sda --这里就决定了grub.conf里面的hd0代表的就是/dev/sda
 
 
rhgb quiet这两个参数是开机时不显示一些启动有关的信息;如果你去掉这两个参数,在开机时就会看到一大串的信息。
# dmesg   --但加不加这两个参数无关紧要。开机后可以使用此命令调出那些信息
 
 
问题:如果我没有把boot分区单独分出来,我的第一个分区就是根分区,那么grub.conf里应该会怎么样改变?
 
 
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz  --加/boot
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet  --加boot
        initrd /boot/initrd-2.6.18-164.el5.img --加boot
 
 
 
 
 
[root@squid ~]# cat /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=SWAP-sda2         swap                    swap    defaults        0 0
 
 
问题:上面如果是我机器的/etc/fstab文件,现在我把第二行,也就是/boot挂载的那一行给删除,会出现什么情况?
 
 
答案:可以启动,但ls /boot目录没有东西
 
因为比如说/dev/sda1挂载到/boot,那么vmlinuz和initrd就是存放在/dev/sda1。
如果不挂载的话,则就找不到vmlinuz和initrd,那么按理来说就不能启动
 
 
但因为系统启动过程是先找grub,后才找的fstab;而且通过grub里的(hd0,0)是去找设备,不是找/boot目录。所以还是可以找到/dev/sda1里的vmlinuz和initrd
 
 
昨天讲fstab时有一个实验就是把fstab整个删掉,还是可以启动的
 
 
 
 
 
 
--一个双系统,分区情况如下
 
[root@localhost ~]# /dev/sda1   /boot
[root@localhost ~]# /dev/sda2   /
[root@localhost ~]# /dev/sda3   swap
[root@localhost ~]# /dev/sda4   扩展分区
 
[root@localhost ~]# /dev/sda5   /1 --第二个操作系统就分了一个根,label为/1
 
--双系统只需要安装一个swap分区,两个系统不能同时打开使用,但是swap分区可以共用
 
 
两个系统都是grub.conf文件,那么到底用的是哪个?
 
 
164.el5 ro root=/dev/sda5 rhgb quiet
        initrd /initrd-2.6.18-164.el5.img
--现在第二段写的是使用第一个操作系统的/boot,却使用第二个操作系统的/
 
[root@localhost ~]# grub-install /dev/sda
 
 
--请问上面的grub.conf的写法,linux01是否能启动?
 
是可以启动的,但是这是限于两个系统都版本内核一致的情况。如果两个系统内核不一致,或者一个rhel,一个ubuntu,显示不能启动。
 
 
再重启系统(进行linux01),就发现,是以第一个操作系统的/boot来引导的,但是后面读取的是第二个操作系统的/ 下的/etc/fstab,所以挂载时,还是只挂载了/dev/sda5;表示这样写,相当于是只借用了/dev/sda1下的vmlinuz和initrd去引导而已
 
 
--总结:grub.conf和fstab这两个文件如果写混乱(特别是内核版本不同的多操作系统的机器),很容易造成一些头和身体不合的错误
 
 
 
 
 
===============================================================
 
 
 
 
手动引导grub
 
手动mv  grub.conf
 
 
grub>root (hd0,0) --进到/boot分区  
 
 
grub>kernel /vmlinuz-xxxxxxx ro root=LABEL=/ --root分区不要写错,label形式或者/dev/sdax形式都可以
 
 
grub>initrd /initrd-xxxxxxxx
 
grub>boot       --boot代表启动
 
 
-----------------------------------------------
 
 
上面实验的几点总结:
 
1,报这个错误kernel-panic
就是写错了,大部分是根分区指定错误
 
 
2,分区类型如果是8e类型(fdisk /dev/sda,然后输入l来查找分区类型)
 
8e为逻辑磁盘组;现在不好整;
 
 
 
3,安装双系统,如果先安装windows,再安装linux,那么linux的grub会自动记录windows的引导;如下
 
引导windows的grub写法
 
title    winxp
rootnoverify (hd0,0)
chainloader +1
 
 
4,关于安装双系统,要有free空间,在不动原来的分区的基础上,再分一个根分区,别的过程都一样,就可以再安装一个系统了
 
 
 
-----------------------
 
grub加密码 (作用是锁住不让别人进入单用户改你的ROOT密码)
 
 
[root@li ~]# grub-md5-crypt --用此命令产生一个密码加密串
Password:
Retype password:
$1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/ --输两次密码就可以产生加密串
 
 
 
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz --在下面加上加密信息
password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/
 
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/1 rhgb quiet
        initrd /initrd-2.6.18-164.el5.img
 
 
实验:如果上面的最后五行是下面这样的写法,会是什么结果?
 
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/1 rhgb quiet  
password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/
        initrd /initrd-2.6.18-164.el5.img
 
 
 
 
================================================================
 
 
 
 
使用grub菜单硬盘安装rhel6.3
 
 
我这里/dev/sda5  挂载到/share目录
 
/share/iso/rhel63-64.iso --把iso放到/share/目录
 
iso挂载,并把挂载后的里面的isolinux目录里的vmlinuz和initrd.img拷出来,也放到/share目录,并把images目录和isolinux目录也拷到/share目录下
/share/rhel63-64.iso
/share/vmlinuz
/share/initrd.img
/share/images/
/share/isolinux/
 
 
然后开机重启,在grub菜单按C键进入grub> 提示符界面
 
grub > root (hd0,4)       --进入到/dev/sda5,也就是我的/share目录
 
grub > kernel /vmlinuz
 
grub > initrd /initrd.img
 
grub > boot --回车后,就进入到了安装界面
 
 
--后面的选择只有一个地方要注意的是:安装方式选择hard drive,然后选择/dev/sda5(也就是你的iso在的分区),别的步骤都一样
 
 
 
 
--这里注意,如果是在rhel6上硬盘安装rhel5的话,因为rhel5不能挂载ext4文件系统,所以你需要在rhel6上mkfs.ext3格式化一个ext3格式的分区,去存放
/share/vmlinuz
/share/images
/share/initrd.img
/share/isolinux/
 
其它的步骤一样
 
 
 
--注意:如果在rhel6上硬盘安装rhel5还要注意的是最好不要使用rhel5的grub去覆盖rhel6的grub;因为rhel5的grub无法引导rhel6系统,但反过来可以
 
 
==============================================================
 
 
vim /etc/inittab
 
 
# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this) --关机
#   1 - Single user mode --单用户模式
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)--多用户模式,但没有NFS,没有网络
#   3 - Full multiuser mode --带网络的文本多用户模式,如果3模式没有网络的话就和2模式一样
#   4 - unused --保留
#   5 - X11 --图形模式
#   6 - reboot (Do NOT set initdefault to this) --重启
#
id:5:initdefault: --设定开机后默认的启动级别,不要设成0或者6,如果设成0或者6致命开机不了,在grub的选择界面按E编辑这一次启动进入5模式(临时,只对这次进系统有效),进入后再修改/etc/initab(这是永久生效)
 
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
 
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3 --这是定义六个级别启动的服务脚本,这六个目录的服务脚本全是做的
l4:4:wait:/etc/rc.d/rc 4 --/etc/rc.d/init.d目录下脚本的软链接
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
 
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now --定义ctrl+alt+del三键重启功能,只能在tty文本界面才能生效,服务器一般都建议把这一句给注释掉,防止误操作
 
 
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6 --定义了六个文本终端
 
 
 
 
几个小实验来验证有关/etc/inittab有关的配置
 
 
1,把默认级别改为3,把tty6终端的那句配置给注释掉
2,重启后,默认进入3级别,使用init 5切换成5级别
3,然后切换tty6会发现黑屏就一个光标,但切换别的tty可以,这是注释tty6那句配置的原因
4,再使用init 3可以切换为3级别
5,如果再使用startx或gdm进入图形的话,相当于是在3级别启动图形程序,就只能用ctrl+alt+F1-F6来切换回文本了
 
 
 
 
======================================================
 
# vim /etc/rc.local
 
 
 
==============================================================
 
 
 
 
 
时间有关的服务
 
at(batch)    crond   anacron
 
 
d代表 daemon
 
/etc/init.d/atd
/etc/init.d/crond
/etc/init.d/anacron
 
 
at
1,任务是一次性的
2,设置的时间点过了,就马上执行
 
 
 
 
[root@li ~]# /etc/init.d/atd start
Starting atd:                                              [  OK  ]
[root@li ~]# chkconfig atd on
 
 
[root@li ~]# at 09:47 031711
at> echo "hello" > /dev/pts/2
at> <EOT> --ctrl+d结束
job 2 at 2011-03-17 09:47
 
 
at         
-l   查看时间job  相当于atq
-d   删除时间job  相当于atrm
-c   显示时间job的内容  
-f   后接一个脚本
 
 
[root@li ~]# vim 1.sh
 
#!/bin/bash
 
echo -e "1\n2\n3\n4\n5\n6\n7\n8" > /dev/pts/2
 
 
[root@li ~]# at 10:07 031711 -f 1.sh
job 8 at 2011-03-17 10:07
 
 
 
还有类似下面的时间推移的写法
[root@li ~]# at now + 10 minutes
[root@li ~]# at now + 1 hours
[root@li ~]# at now + 1 days
[root@li ~]# at now + 1 weeks
[root@li ~]# at now + 1 months
[root@li ~]# at now + 1 years
 
 
[root@li ~]# atq
1       2017-11-03 09:46 a root
[root@li ~]# at -l
1       2017-11-03 09:46 a root
[root@li ~]# file /var/spool/at/a00001017fee0a
/var/spool/at/a00001017fee0a: Bourne shell script text executable
[root@li ~]# vim /var/spool/at/a00001017fee0a
--任务要执行的内容就在此文件的最后
[root@li ~]# at -c 1 --用命令查看1号job的内容
 
 
 
[user1@li ~]$ at 10:09 031711 --普通用户也可以使用at服务
at> touch /home/user1/1
at> <EOT>
job 9 at 2011-03-17 10:09
 
 
at任务的使用限制:
/etc/at.allow
/etc/at.deny
/etc/at.allow --在这里可以写上允许执行at的普通用户(格式方面也要注意,不要乱空格),一个用户一行;存在的话就不用去考虑at.deny
/etc/at.deny --在这里可以定上拒绝执行at的普通用户,一个用户一行;如果at.allow不存在,才生效
 
 
--默认系统只有一个/etc/at.deny,并且为空,也就是说默认系统的任何普通用户都可以使用at服务
 
 
 
===================================
 
 
 
  batch   executes commands when system load levels permit; in other words,
               when the load average drops below 0.8, or the value specified  in
               the invocation of atrun.
 
batch 命令
当负载小于0.8时,才会执行   ;用法与at 一样
 
 
小实验:
[root@li ~]# batch -f 1.sh --负载小于0.8,立刻执行了
 
 
rhel6里使用batch需要象下面这样操作
[root@li ~]# batch
at> sh 1.sh
at> <EOT>
 
 
下面做一些操作,比如 cp 一个大文件,把负载提高到0.8以上
[root@li ~]# batch -f 1.sh --再次运行,没有立刻执行
下面取消cp操作,使用top查看等待负载下降到0.8以下后上面的就会执行(可能有一点时间延迟,应该是程序设计的监控时间间隙在起作用),
 
 
补充:使用atrun -l 1.2  --可以把这个负载值设定为1.2
 
 
--上面这个不是特别靠谱,如果有这种需要求的话,可以写脚本截取负载值进行比较,条件符则执行
 
 
 
 
 
练习:
1.每两秒都监控是否有人ssh到你的机器,如果有人ssh上来,则把它kill掉,并且,使用iptables拒绝它登录,但是会在30分钟后,取消对它的拒绝
下面是拒绝35ssh到你的机器的写法
iptables -A INPUT -p tcp --dport 22 -s 172.16.2.35 -j REJECT
取消的写法
iptables -D INPUT -p tcp --dport 22 -s 172.16.2.35 -j REJECT
 
 
 
--下面这个脚本,只能用于一个用户
#!/bin/bash
 
 
pts=`who |grep -v "(:0" |awk '{print $2}'`
ip=`who |grep -v "(:0" |awk -F"(" '{print $2}'|awk -F")" '{print $1}'`
pid=`ps -ef |grep $pts |grep sshd |grep -v grep |awk '{print $2}'`
kill -9 $pid
iptables -A INPUT -p tcp --dport 22 -s $ip -j REJECT
at now + 30 minutes << EOF
iptables -D INPUT -p tcp --dport 22 -s $ip -j REJECT
EOF
sleep 2
 
 
 
--下面这个脚本放到后台执行,无论哪个用户或哪几个,ssh上来,2秒后,就被踢掉,并30分钟登录不了
#!/bin/bash
 
 
while true
do
line=`who |grep -v "(:" |wc -l`
 
for i in `seq $line`
do
pts=`who |grep -v "(:" |awk '{print $2}' |head -$i |tail -1`
ip=`who |grep -v "(:" |awk -F"(" '{print $2}'|awk -F")" '{print $1}' |head -$i |tail -1`
pid=`ps -ef |grep $pts |grep sshd |grep -v grep |awk '{print $2}'`
kill -9 $pid
iptables -A INPUT -p tcp --dport 22 -s $ip -j REJECT
at now + 30 minutes << EOF > /dev/null 2>&1
iptables -D INPUT -p tcp --dport 22 -s $ip -j REJECT
EOF
done
 
sleep 2
done
 
 
 
 
#!/bin/bash
echo "check ssh...."
while true
do
     who | awk -F"(" '{print $2}' | sed 's/.$//' |  while read ip
     do
         if [ `echo $ip | awk -F"." 'END{print NF}'` -eq 4 ]
         then
                echo "$ip ssh close"
                iptables -A INPUT -p tcp --dport 22 -s $ip -j REJECT
                ipssh=`who | awk  '{print $2}' | head -$i | tail -1`
                ipsshid=`ps -ef | grep "@$ipssh" | awk '{print $2}'`
                kill -9 $ipsshid 2> /dev/null
                echo iptables -D INPUT -p tcp --dport 22 -s $ip -j REJECT | at now + 30 minutes
         fi
     done
     sleep 2
done
 
 
 
 
 
 
 
 
2,当负载低于0.3的时候,则执行一个事件(事件你自定义 )
 
 
 
 
 
 
 
 
3.写一个倒计时脚本,要求显示离2013年1月1日的凌晨0点,还有多少天,多少时,多少分,多少秒
 
 
#!/bin/bash
 
 
goal=`date +%s -d 20130101`
 
while true
do
        now=`date +%s`
        day=$[($goal-$now)/86400]
        hour=$[($goal-$now-$day*86400)/3600]
        minute=$[($goal-$now-$day*86400-$hour*3600)/60]
        second=$[$goal-$now-$day*86400-$hour*3600-$minute*60]
clear
        echo "离2013年还有$day天:$hour时:$minute分:$second秒"
        sleep 1
done
 
 
 
 
 
 
=======================================================
 
 
 
crontab
 
 
crontab特点:
1,能够周期性的运行
2,时间过了就不执行,等下一个周期再执行 (或者使用anacron补足执行)
 
 
 
[root@li ~]# /etc/init.d/crond start
Starting crond:                                            [  OK  ]
[root@li ~]# chkconfig crond on
 
 
 
[root@li ~]# vim /etc/crontab   --主配置文件
 
执行周期时间 执行身份  命令行 目录
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
 
 
 
时间格式
01 *  *  *  *
分钟: 0-59
小时: 0-23
日: 1-31   看月份定
月: 1-12
0-7    0和7都是代表星期天
 
 
 
   时间格式的几种特殊符号写法
* 代表每分钟,每小时,每日,每星期,每月..........
,       代表分隔时间 1,5,6,7
- 代表一个时间范围  7-20
/n 代表每隔n个单位   */3 --不能写成/3,而要写成*/3
 
 
 
 
01 1,5,12,18,23 * * * --每天的1,5,12,18,23点的第一分钟
01 * 5-15 * * --每月的5号到15号的每小时的第一分钟
*/2 * * * * --每两分钟
*/3 1,3,8 1-5 3-6 7     --每年的3到6月的1到5号的1,3,8点的每三分钟  (只有星期天才行)  
 
 
 
 
 
 
例子1;
vim /etc/crontab
 
* * * * * root  echo 'crontab'> /dev/pts/2 --每分钟都会去echo一个crontab到/dev/pts/2终端  
 
 
例子2;
vim /etc/crontab
* * * * * root  run-parts /etc/cron.minutely --做一个每分钟都会执行的目录,把每分钟都要执行的脚本任务放到这个目录里,注意要有执行权限 
 
 
 
注意:
--修改了/etc/crontab的配置后,不需要重启crond服务,但要保证是开启状态
--写到主配置文件里的要写执行身份,如果后面接的是目录,则要加上run-parts,并且目录内的脚本为可执行
 
 
 
 
命令设置方法:--不同的用户都能拥有自己的时间任务(当然要对此任务有能执行的权限)
 
 
crontab
-e --编辑自己的时间任务
-l --列出自己的时间任务
-r --删除时间任务
-i --删除前要求确认
 
[root@li ~]# crontab -e
30 18 * * * /sbin/init 0 --写上每晚6点30分钟自动关机    注意要root用户写才有效
 
 
[root@li ~]# crontab -l --列出自己的时间任务
30 18 * * * /sbin/init 0  
 
 
[root@li ~]# crontab -r --全删掉自己的时间任务,想要只删除一行或者两行,就要自己去手动删除
 
crontab任务
/var/spool/cron/*      --*代表用户
 
# cat /var/log/cron      --查看这个日志文件,可以看到所有的与crontab有关的日志记录
 
 
root用户管理普通用户的时间任务
crontab -e -u d --编辑d用户的时间任务
crontab -l -u d --列出d用户的时间任务
crontab -r -u d --删除d用户的时间任务
 
 
 
crontab的使用限制: atd服务是一样的
 
 
/etc/cron.allow   --写上允许使用crontab的普通用户名,一行写一个;有些文件的话就不考虑/etc/cron.deny
/etc/cron.deny  --写上拒绝使用crontab的普通用户名,一行写一个;如果/cron.allow不存在,才生效
 
 
 
--实际应用时要注意的是:
如果时间任务比较多的情况下,都是周期性执行,根据任务的需求,负载,时间规定,最好是把各项任务给平均分开,防止任务时间点挤在一起,造成服务器的某一时间点负载过高
 
 
 
 
题目:
比如要写一个备份的自动运行任务
要求是:
1.每年的第一天(1月1号)备份所有数据
2.每季度的第一天(指的4月,7月,10月这三个月)备份季度内产生的所有数据(如7月1号备份4月到7月产生的数据)
3.别的月份的第一天(除1,4,7,10月外)备份每月产生的所有数据(如5月1号则备份4月内产生的数据)
4,一年内的每个星期天备份这个星期以来的数据(如10月8号为星期天,则备份它这个星期内产生的数据)
5,除了上面定义的特定天数外(除了每月1号和星期天),每天备份前一天产生的数据
 
--上面要注意的是:
6.注意时间的重合性,如某月的1号正好是星期天的话,则会重复
7.要求上面只用写出时间,如何备份不用管,并假设都是每晚凌晨的3点01分做
 
 
如果觉得上面的备份策略不好,可以如何改?
 
 
 
 
 
oracle的备份级别为例:
 
1.1 3.30 4.1  4.2   4.3    4.4    4.5 4.6   4.7   4.8
 
0   4  3    3      3     3      4  3     3     3
 
 
 
 
 
 
 
 
 
 
 
============================================================
 
 
anacron
 
anacron 特点:
crond服务配合使用,保证crond没有执行的任务可以延后执行
 
 
配置文件: vim /etc/anacrontab
 
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
 
天数  延后时间(分钟) 自定义的名字 执行命令串   目录
 
1       65      cron.daily              run-parts /etc/cron.daily
7       70      cron.weekly             run-parts /etc/cron.weekly
30      75      cron.monthly            run-parts /etc/cron.monthly
 
1       65      cron.daily              run-parts /etc/cron.daily
上面这句话的意思为:
/etc/cron.daily目录内的脚本在1天内没有被执行过,那么就推后65分钟执行,执行完成后,就把时间给记录到/var/spool/anacron/cron.daily文件里
 
 
#/etc/init.d/anacron start  --启服务
 
# cat /var/log/cron   --查看日志会有下面信息,因为前两天讲chkconfig时把这些服务都关了,所以已经有两天没做了,现在启动起来,就会在65分钟后做
 
Jul  8 11:45:27 li anacron[3104]: Anacron 2.3 started on 2011-07-08
Jul  8 11:45:27 li anacron[3104]: Will run job `cron.daily' in 65 min.
Jul  8 11:45:27 li anacron[3104]: Will run job `cron.weekly' in 70 min.
Jul  8 11:45:27 li anacron[3104]: Jobs will be executed sequentially
 
 
 
--一般来说,此服务不需要特定的配置,直接打开就好了
 
 
 
 
思考题:
现在我有下面的一个自动关机的时间任务
[root@li ~]# crontab -l
30 20 * * *  /sbin/init 0
 
:  如果我在晚上20点30分之前手动关闭了电脑,那是否第二天9点30开机后,会在10点35分自动关机呢?
 
 
在虚拟机上测试的过程:
1,# vim /etc/cron.daily/shutdown.sh
#!/bin/bash
 
/sbin/init 0
 
# chmod 755 /etc/cron.daily/shutdown.sh
 
2, vim /etc/anacrontab  --把65分钟改短点,比如说2分钟
 
3,date -s "xxxxx"  --把时间改成比如说2天后
 
4,/etc/init.d/crond  restart
   /etc/init.d/anacron  restart
 
5,cat /var/log/cron --可以看到2分钟后将要执行cron.daily的日志
 
 
6,2分钟后,自动关机
 
 
 
 
 
 
 
 
 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!