linux系统的任务计划
#cron 定期自动执行某一个脚本
关于cron任务计划功能的操作都是通过crontab这个命令来完成的。其中常用的选项有:
-u :指定某个用户,不加-u选项则为当前用户;
-e :制定计划任务;
-l :列出计划任务;
-r :删除计划任务。
[[email protected] ~]# crontab -e
no crontab for root - using an empty one
使用 crontab -e 来进行编写任务计划,这实际上是使用vim工具打开了crontab的配置文件,我们写下如下内容:
01 10 05 06 3 echo "ok" > /root/cron.log
每个字段的数字分表表示什么呢?
从左到右,依次为:分,时,日,月,周,命令行。而上面的例子的含义是:在6月5日(这一天必须是星期3)的10点01分执行命令 echo "ok" > /root/cron.log
crontab -e 实际上是打开了 “/var/spool/cron/username” (如果是root则打开的是/var/spool/cron/root)这个文件。使用的是vim编辑器,所以要保存的话则在命令模式下输入:wq即可。但是,你千万不要直接去编辑那个文件,因为可能会出错,所以一定要使用 crontab -e 来编辑。查看已经设定的任务计划使用 crontab -l 命令:
[[email protected] ~]# crontab -l01 10 05 06 3 echo "ok" > /root/cron.log
删除计划任务要用 crontab -r
[[email protected] ~]# crontab -r[[email protected] ~]# crontab -lno crontab for root
cron的内容不算太难,但是需要你牢固掌握,
练习题
每天凌晨1点20分清除/var/log/slow.log这个文件
每周日3点执行 “/bin/sh /usr/local/sbin/backup.sh”
每月14号4点10分执行 “/bin/sh /usr/local/sbin/backup_month.sh”
每隔8小时执行 “ntpdate time.windows.com”
每天的1点,12点,18点执行 “/bin/sh /usr/local/sbin/test.sh”
每天的9点到18点执行 “/bin/sh /usr/local/sbin/test2.sh”
习题答案:
1. 20 1 * * * echo "" >/var/log/slow.log
2. 0 3 * * 0 /bin/sh /usr/local/sbin/backup.sh
3. 10 4 14 * * /bin/sh /usr/local/sbin/backup_month.sh
4. 0 */8 * * * ntpdate time.windows.com
5. 0 1,12,18 * * * /bin/sh /usr/local/sbin/test.sh
6. 0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh
练习完上面的题目,相信你会有一些小疑问,这里要简单说一下,每隔8小时,就是用全部小时(0-23)去除以8,仔细想一下结果,其实算出来应该是0,8,16三个数。当遇到多个数(分钟、小时、月、周)例如第5题,则需要用逗号隔开。而时间段是可以用 n-m 的方式表示的,比如第六题中的(9-18)。等设置好了所有的计划任务后需要查看一下crond服务是否启动:
[[email protected] ~]# service crond statuscrond (pid 945) 正在运行...
如果是停止状态,则需要启动它:
[[email protected] ~]# service crond statuscrond 已停[[email protected] ~]# service crond start正在启动 crond: [确定]
linux的系统服务管理
日常用不到则要把它停掉,一来可以节省资源,二来可以减少安全隐患。在linux上同样也有相关的工具来管理系统的服务。
1. ntsysv服务配置工具
用来配置哪些服务开启或者关闭,有点类似图形界面,不过是使用键盘来控制的。
如果没有这个命令请使用yum install -y ntsysv 安装它。安装好后,直接运行命令 ntsysv 回车后弹出一个配置界面:
按键盘的上下方向键可以调节红色光标,按空格可以选择开启或者不开启,如果前面的中括号内显示有 * 则表示开启否则不开启。通过这个工具也可以看到目前系统中所有的服务。建议除 “crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl” 外其他服务全部停掉。选择好后,按 “tab” 键选择 “确定”, 然后回车,需要重启机器才能生效。
2. chkconfig服务管理工具
Linux系统所有的预设服务可以查看/etc/init.d/目录得到:
[[email protected] ~]# ls /etc/init.d/
abrt-ccpp cpuspeed ip6tables mdmonitor postfix sandboxabrtd crond iptables messagebus psacctsaslauthdabrt-oops functions irqbalance netconsole quota_nld singleacpid haldaemon kdump netfs rdisc smartdatd halt killall network restorecond sshdauditd htcacheclean lvm2-lvmetad ntpd rngd sysstatblk-availability httpd lvm2-monitor ntpdate rsyslog udev-post
其实这就是系统所有的预设服务了。为什么这样讲,因为系统预设服务都是可以通过这样的命令实现service 服务名 start|stop|restart 这里的服务名就是/etc/init.d/目录下的这些文件了。除了可以使用service crond start 启动crond外,还可以使用 /etc/init.d/crond start 来启动。
言归正传,我们可以使用 chkconfig --list 列出所有的服务以及每个级别是否开启:
[[email protected] ~]# chkconfig --list
abrt-ccpp 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:启用 6:关闭
abrtd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:启用 6:关闭
acpid 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭
atd 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭
auditd 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭
这里的级别(0,1,2,3,4,5,6)就是 /etc/inittab 里面的那几个启动级别了,0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模式,6为重启;在一般的Linux系统实现中,都使用了2、3、4、5几个级别,在CentOS系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示图形登录方式。我们可以使用grep命令把我们想要看的服务过滤出来:
[[email protected] ~]# chkconfig --list |grep croncrond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
现在我们只是看到了各服务在每个级别下是否开启,那么如何去更改哪个级别下是否开启呢?
[[email protected] ~]# chkconfig --level 3 crond off[[email protected] ~]# chkconfig --list |grep croncrond 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭
用 --level 指定级别,后面是服务名,然后是off或者on,`--level 后还可以跟多个级别:
[[email protected] ~]# chkconfig --level 345 crond off[[email protected] ~]# chkconfig --list |grep cron
crond 0:关闭 1:关闭 2:启用 3:关闭 4:关闭 5:关闭 6:关闭
另外还可以省略级别,默认是针对2,3,4,5级别操作:
[[email protected] ~]# chkconfig crond on[[email protected] ~]# chkconfig --list |grep cron
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
chkconfig 还有一个功能就是可以把某个服务加入到系统服务,即可以使用 service 服务名 start 这样的形式,并且可以在 chkconfig --list 中查找到。当然也能删除掉。
[[email protected] ~]# chkconfig --del crond[[email protected] ~]# chkconfig --list |grep cron[[email protected] ~]# chkconfig --add crond[[email protected] ~]# chkconfig --list |grep croncrond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
这个功能常用在把自定义的启动脚本加入到系统服务当中。
linux系统日志
日志记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测,还可以实时的监测系统状态,监测和追踪侵入者等等。
/var/log/message, 它是核心系统日志文件,包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO错误、网络错误和其他系统错误都会记录到这个文件中。另外其他信息,比如某个人的身份切换为root以及用户自定义安装的软件(apache)的日志也会在这里列出。通常,/var/log/messages是在做故障诊断时首先要查看的文件。那你肯定会说了,这么多日志都记录到这个文件中,那如果服务器上有很多服务岂不是这个文件很快就会写的很大,没错,但是系统有一个日志轮询的机制,每星期切换一个日志,变成message.xxxxxxxx, message.xxxxxxxx, ... messages.xxxxxxxx 连同messages一共有5个这样的日志文件。这里的xxxxxxxx就是按照日期的格式生成的文件,在CentOS5里,这个后缀并不是日期而是数字1,2,3,4. 这是通过logrotate工具的控制来实现的,它的配置文件是/etc/logrotate.conf如果没有特殊需求请不要修改这个配置文件。
[[email protected] ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs rotate
4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files
compressed
/var/log/messages是由syslogd这个守护进程产生的,如果停掉这个服务则系统不会产生/var/log/messages,所以这个服务不要停。Syslogd服务的配置文件为/etc/syslog.conf这个文件定义了日志的级别,具体详细的东西阿铭不再阐述,因为若没有特殊需求是不需要修改这个配置文件的,请使用man syslog.conf 获得更多关于它的信息。
除了关注/var/log/messages外,你还应该多关注一下 dmesg 这个命令,它可以显示系统的启动信息,如果你的某个硬件有问题(比如说网卡)用这个命令也是可以看到的。
关于安全方面的日志,简单介绍几个命令或者日志。
命令 : last 查看、var/log/wtmp 日志里用户登录历史
[[email protected] ~]# last |head
root pts/0 192.168.0.207 Wed Jun 12 20:28 still logged in
last命令用来查看登录Linux历史信息,从左至右依次为账户名称、登录终端、登录客户端ip、登录日期及时长。last命令输出的信息实际上是读取了二进制日志文件/var/log/wtmp, 只是这个文件不能直接使用cat, vim, head, tail等工具查看。
#dmesg 命令,主要看系统实时的硬件设备抛出的信息,日志为 /var/log/dmesg
另外一个和登陆信息有关的日志文件为/var/log/secure, 该日志文件记录验证和授权等方面的信息,比如ssh登陆系统成功或者失败,都会把相关信息记录在这个日志里。
xargs与exec
1. xargs应用
[[email protected] ~]# echo "121212121212" > 123.txt
[[email protected] ~]# ls 123.txt | xargs cat 121212121212
它的作用就是把管道符前面的输出作为xargs后面的命令的输入。它的好处在于可以把本来两步或者多步才能完成的任务简单一步就能完成。xargs常常和find命令一起使用,比如,查找当前目录创建时间大于10天的文件,然后再删除。
[[email protected] ~]# find . -mtime +10 |xargs rm
这种应用是最为常见的,xargs后面的rm 也可以加选项,当是目录时,就需要-r选项了。在阿铭看来xargs的这个功能不叫什么,它的另一个功能才叫神奇。现在我有一个这样的需求,查找当前目录下所有.txt的文件,然后把这些.txt的文件变成.txt_bak。正常情况下,我们不得不写脚本去实现,但是使用xargs就一步。
[[email protected] ~]# mkdir test
[[email protected] ~]# cd test
[[email protected] test]# touch 1.txt 2.txt 3.txt 4.txt 5.txt
[[email protected] test]# ls
- txt 2.txt 3.txt 4.txt 5.txt
[[email protected] test]# ls *.txt |xargs -n1 -i{} mv {} {}_bak
[[email protected] test]# ls 1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak 5.txt_bak
xargs -n1 –i{} 类似for循环,-n1意思是一个一个对象的去处理,-i{}把前面的对象使用{}取代,mv {} {}_bak 相当于 mv 1.txt 1.txt_bak。
2. exec应用
使用find命令时,经常使用一个选项就是这个-exec了,可以达到和xargs同样的效果。比如,查找当前目录创建时间大于10天的文件并删除:
[[email protected] ~]# find . -mtime +10 -exec rm -rf {} \;
这个命令中也是把{}作为前面find出来的文件的替代符,后面的 \ 为 ; 的脱意符,不然shell会把分号作为该行命令的结尾。这个-exec有时候也挺实用的,它同样可以实现刚刚上面批量更改文件名的需求:
[[email protected] test]# ls 1.txt_bak 2.txt_bak 3.txt_bak 4.txt_bak 5.txt_bak [[email protected] test]# find ./*_bak -exec mv {} {}_bak \;
[[email protected] test]# ls
1.txt_bak_bak 2.txt_bak_bak 3.txt_bak_bak 4.txt_bak_bak 5.txt_bak_bak
screen工具介绍
有时候,我们也许会有这样的需求,要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办?你可以把命令或者脚本丢到后台运行,不过也不保险。阿铭下面就介绍两种方法来避免这样的问题发生。
1. 使用nohup
[[email protected] ~]# cat /usr/local/sbin/sleep.sh
#! /bin/bash sleep 1000
[[email protected] ~]# nohup sh /usr/local/sbin/sleep.sh & [1] 19997
[[email protected] ~]# nohup: 忽略输入并把输出追加到"nohup.out"
直接加一个 ‘&’ 虽然丢到后台了,但是当退出该终端时很有可能这个脚本也会退出的,而在前面加上 nohup 就没有问题了,nohup的作用就是不挂断地运行命令。
2. screen工具的使用
简单来说,screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的SSH连接窗口那样。
下面阿铭介绍screen的一个简单应用。
1)打开一个会话,直接输入screen命令然后回车,进入screen会话窗口。如果你没有screen命令,请用yum install -y screen 安装。
[[email protected] ~]# screen
[[email protected] ~]# screen -ls 查看已经打开的screen会话
[[email protected] ~]# screen -ls
There is a screen on:
20001.pts-0.localhost
(Attached) 1 Socket in /var/run/screen/S-root.
3)Ctrl +a 再按d退出该screen会话,只是退出,并没有结束。结束的话输入Ctrl +d 或者输入exit
4)退出后还想再次登录某个screen会话,使用sreen -r [screen 编号],这个编号就是上例中那个20001. 当只有一个screen会话时,后面的编号是可以省略的。当你有某个需要长时间运行的命令或者脚本时就打开一个screen会话,然后运行该任务。按ctrl +a 再按d退出会话,不影响终端窗口上的任何操作。
http://ask.apelearn.com/question/5440 拓展