1、某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案

(1)在下午4 :50删除/abc目录下的全部子目录和全部文件;

(2)从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内;

(3)每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:backup.tar.gz;

(4)在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc);

(5)在早晨8:00前开机后启动。

问题分析:

首先如何判断时间?

其次如何执行脚本?放在系统启动crontab中执行,还是启动后一直运行该脚本

最后执行对应的操作

修改crontab如下:

 1 # /etc/crontab: system-wide crontab
  2 # Unlike any other crontab you don't have to run the `crontab'
  3 # command to install the new version when you edit this file
  4 # and files in /etc/cron.d. These files also have username fields,
  5 # that none of the other crontabs do.
  6
  7 SHELL=/bin/sh
  8 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  9
 10 # m h dom mon dow user  command
 11 17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
 12 25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repor    t /etc/cron.daily )
 13 47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repor    t /etc/cron.weekly )
 14 52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --repor    t /etc/cron.monthly )
 15 #
 16 # this is a test for practise, could be deleted anytime
 17 # m h dom mon dow user  command                                              增加下面几行
 18 50 16   * * *   root    cd / ; rm -rf /abc && mkdir abc            下午4 :50删除/abc目录下的全部子目录和全部文件,              
 19 * 8-18/1        * * *   root    cd /;cd /var/log;cat user.log|awk'{print $1}' >>     /backup/bak01.txt                     功能2
 20 50 17 * * 1 root cd /; tar -cfvz backup.tar.gz /backup                                       功能3,系统没找到data文件,用backup代替
 21 55 17 * * * umount /dev/hdc                                                                    功能4
 22



网络答案:

1)用vi创建编辑一个名为prgx的crontab文件;

       prgx文件的内容:

               50 16 * * * rm -r /abc/*

 

(2)、0 8-18/1 * * * cut -f1 /xyz/x1>;>; /backup/bak01.txt

(3)、50 17 * * * tar zcvf backup.tar.gz/data

(4)、55 17 * * * umount /dev/hdc

(5)、由超级用户登录,用crontab执行 prgx文件中的内容:

root@xxx:#crontab prgx;在每日早晨8:00之前开机后即可自动启动crontab。



知识扩展:

crontab命令

如果发现您的系统里没有这个命令,请安装下面两个软件包.

vixie-cron

crontabs

NAME
       crontab - maintain crontab files for individual users (V3)

SYNOPSIS
       crontab [ -u user ] file
       crontab [ -u user ] { -l | -r [ -i ] | -e }

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。 

常用参数:

crontab   -l   //查看当前用户下的cron任务

crontab -e  //编辑当前用户的定时任务

crontab -u  linuxso  -e  //编辑用户linuxso的定时任务

具体用法和格式:

 

基本格式 :
*  *  *  *  *  command(绝对路径)   相对路径是相对于当前目录来说的,绝对路径则不是,绝对路径是要从根目录写起的
分 时 日 月 周 命令                                   

                                                        绝对路径就是以 / 根目录为参照的路径名;
                                                        相对路径就是以当前目录为参照的路径名

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache

 

名称 : crontab

使用权限 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的文件替代目前的crontab。

crontab-[-u user]-用标准输入替代目前的crontab.

crontab-1[user]-列出用户目前的crontab.

crontab-e[user]-编辑用户目前的crontab.

crontab-d[user]-删除用户目前的crontab.

crontab-c dir- 指定crontab的目录。

crontab文件的格式:M H D m d cmd.

 

M: 分钟(0-59)。

H:小时(0-23)。

D:天(1-31)。

m: 月(1-12)。

d: 一星期内的天(0~6,0为星期天)。

cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量

说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定

user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设

定自己的时程表。

参数 :

crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数

来指定使用那个文字编辑器(比如说 setenv VISUAL joe)

crontab -r : 删除目前的时程表

crontab -l : 列出目前的时程表

crontab file [-u user]-用指定的文件替代目前的crontab。

时程表的格式如下 :

f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执

行的程序。

当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其余类推

当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其类推

当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其类推

当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其类推

使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

 

● 0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache

● 50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务

● 50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务

● 0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘

● 1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件

● 00 03 * * 1-5 find /home "*.xxx" -mtime +4 -execrm {} /;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
● 30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令

#每天早上7点执行一次 /bin/ls :

0 7 * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name :

0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"

20 0-23/2 * * * echo "haha"

注意 :

当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之

后加上 > /dev/null 2>&1 即可

 

例子2 :

#每天早上6点10分

10 6 * * * date

#每两个小时

0 */2 * * * date

#晚上11点到早上8点之间每两个小时,早上8点

0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * mon-wed date

#1月份日早上4点

0 4 1 jan * date

范例

$crontab -l 列出用户目前的crontab.

http://www.linuxso.com/command/crontab.html

问题解决:

ee@Loong:~$ crontab -e
no crontab for yee - using an empty one
/tmp/crontab.OuAZMx/crontab: 设备上没有空间
yee@Loong:~$ crontab

文件系统              容量  已用 可用 已用% 挂载点
/dev/sda5              20G  7.2G   12G  39% /
tmpfs                 248M   16K  248M   1% /lib/init/rw
udev                  248M  976K  247M   1% /dev
tmpfs                 248M   16K  248M   1% /dev/shm
/dev/sda6             121G  2.4G  113G   3% /home
shm                   248M  248M     0 100% /tmp
/dev/sda5              20G  7.2G   12G  39% /mnt

看来确实无空间了;

若还是不能解决,参考:http://thedaneshproject.com/posts/no-space-left-on-device/


目录切换

linux有四种基本文件系统类型:
--普通文件:如文本文件、c语言源代码、shell脚本等,可以用cat、less、more、vi等来察看内容,用mv来改名;
--目录文件:包括文件名、子目录名及其指针,可以用ls列出目录文件;
--链接文件:是指向一索引节点的那些目录条目,用ls来查看时,链接文件的标志用l开头,而文件后以"->"指向所链接的文件;
--特殊文件:如磁盘、终端、打印机等都在文件系统中表示出来,常放在/dev目录内;
可以用file命令来识别。


linux系统中,所有的文件与目录都是由根目录/开始,不是以/开头的就是相对路径;
.:表示当前目录,也可以用./表示;
..:表示上一级目录,也可以用../表示;
~:代表用户自己的宿主目录;

/:处于Linux文件系统树形结构的最顶端,我们称它为Linux文件系统的root,它是Linux文件系统的入口。所有的目录、文件、设备都在/之下,它是Linux文件系统最顶层的唯一的目录;
        一般建议在根目录下面只有目录,不要直接存放文件;根目录是linux系统启动时系统第一个载入的分区,所以启动过程中用到的文件应该都放在这个分区中, 其中/etc、/bin、/dev、/lib、/sbin这5个子目录都应该要与根目录连在一起,不可独立成为某个分区;
/bin:存放所有用户都可以使用的linux基本操作命令;(目录中多是可执行的二进制文件)
/dev:设备文件目录,虚拟文件系统,主要存放所有系统中device的相关信息,不论是使用的或未使用的设备,只要有可能使用到,就会在/dev中建 立一个相对应的设备文件;设备文件分为2种类型:        字符设备文件和块设备文件(目录中基本上都是设备文件,如硬盘设备文件/dev/sda)
        /dev/console:系统控制台,也就是直接和系统连接的监视器;
        /dev/hd:IDE设备文件;
        /dev/sd:sata、usb、scsi等设备文件;
        /dev/fd:软驱设备文件;
        /dev/tty:虚拟控制台设备文件;
        /dev/pty:提供远程虚拟控制台设备文件;
        /dev/null:所谓"黑洞",所有写入该设备的信息都将消失,如当想要将屏幕上的输出信息隐藏起来时,只要将输出信息输入到/dev/null中即可;


2、设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etcyy为年,mm为月,dd为日。Shell程序fileback存放在/usr/bin目录下。

参考答案:

(1)编写shell程序fileback:

#!/bin/sh

DIRNAME=`ls /root | grep bak`

if [ -z "$DIRNAME" ] ; then

mkdir /root/bak

cd /root/bak

fi

YY=`date +%y`

MM=`date +%m`

DD=`date +%d`

BACKETC=$YY$MM$DD_etc.tar.gz

tar zcvf $BACKETC /etc

echo "fileback finished!"

(2)编写任务定时器:

echo "0 0 1 * * /bin/sh /usr/bin/fileback">; /root/etcbakcron

crontab /root/etcbakcron

或使用crontab -e 命令添加定时任务:

0 1 * * * /bin/sh /usr/bin/fileback


posted on 2022-07-05 18:13  我在全球村  阅读(508)  评论(0编辑  收藏  举报