概念扫盲
程序与进程
程序:未运行
进程:运行中,由cpu分配一个标识符pid(program id)
=========================================================================================================
前台运行 || 后台运行
不需要交互的一般都会丢到后台去.
如果程序不是默认后台执行,我们可以手动在后面加"&",吧进程丢到后台.
举个栗子:
查看运行在后台的ssh程序.
sudo netstat -lntup|grep ssh
[2017/8/15 20:40:14] tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1013/sshd
[2017/8/15 20:40:14] tcp6 0 0 :::22 :::* LISTEN 1013/sshd
如上所示,pid为1013
像ssh这种一直生存着,基本上与系统共存亡的,我们一般称之为守护进程(服务)
=========================================================================================================
如何控制守护进程?
crond(crontab)
与之类似的功能还有atd(当然这里他不是主角).
crond每分钟会去检查系统是否存在需要执行的任务,如果存在,那么就执行那些任务.
没错,这货就是个定时器.
想想看js中的internal,TMD的道理还是相同的.
crond对于秒无能为力
真想用,那就自己写个shell,
或者使用quartz(这是什么鬼东西啊,不认识)
========================================================================================================
定时任务的应用
1. 举个栗子,备份
2. 发邮件
...
=========================================================================================================
定时任务分
系统自带的定时任务
自定义的定时任务
=========================================================================================================
cron的格式
at
绿叶1号
适用于只执行一次的任务
这货用的很少,基本没人用,了解即可
我们写入的配置会被atd服务读取执行.
anacron
绿叶2号
适应于非24小时开机的服务器执行的定时任务
基本也是没人用
cron
红花
crond是一个服务
crontab是用户用来设置规则的
常见的参数是
-l --list
-e --edit
corntab操作的文件是/var/spool/cron/${user}
推荐使用crontab -e,因为有语法检查,当然了你有信心,直接该文件我也没意见
用户的定时任务格式是7列
系统的定时任务格式是8列,
其实列数不重要,不同版本可能有差异,
自己看着说明书搞就行了
crontab的格式如下(文件来自/etc/crontab)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
对应的是" 分时日月周"
* 任意值
- 一段时间范围,栗子:5-10
, 多个值之间的分割符,比如说:5,8,9,10
/n 表示每隔n单位时间执行一次
实战
小任务:
每分钟打印一次自己的名字到指定文件中.
解:
添加文件
touch /home/guang/notes/test_crontab_result.log
然后直接跑到/etc/crontab中添加一行数据
*/1 * * * * guang echo "huang guang da" >> /home/guang/notes/test_crontab_result.log
结果如下:
➜ notes cat test_crontab_result.log
huang guang da
huang guang da
nice
但是有问题,/1是多余的,本来就是每分钟,画蛇添足了,大兄弟
=========================================================================================================
小任务:
每天凌晨3点执行一个脚本(内容随意,本意是备份,现在改为输出名字吧)
解:
首先,添加touch /home/guang/notes/backup_result.log
然后添加脚本/home/gaung/bin/backup.sh
vi /home/gaung/bin/backup.sh
# here is the shell use to finish back up task in 3:00 everyday
# @author guang
# @date 2017-08-15
echo "huang guang da" >> /home/guang/notes/backup_result.log
最后,跑到/etc/crontab中添加一行数据
* 3 * * * guang /bin/sh /home/gaung/bin/backup.sh
# 这里有两个要注意的点:1 使用sh来执行脚本;2 sh 和 脚本都要写全路径
补充
上面/etc/crontab是属于系统级的任务排程
除此以外还有用户级的任务排程
用户的定时任务文件在/etc/spool/cron/{user};文件默认是不存在的,当使用crontab -e 进行任务编写时才会添加该文件
查看任务的执行情况可以去看日志/etc/log/cron
1. centos7默认每周日志轮替;
2. 分析日志可以帮助查看系统是否运行了不正常的任务,如被植入木马等
关于用户写任务排程的权限可以查看修改/etc/cron.deny和/etc/cron.allow
编写任务
[root@com]/var/spool/cron# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@com]/var/spool/cron# ls
root
[root@com]/var/spool/cron# crontab -u guang -e
no crontab for guang - using an empty one
crontab: installing new crontab
[root@com]/var/spool/cron# ls
guang root
[root@com]/var/spool/cron#
查看日志:
Oct 14 22:34:02 com CROND[4214]: (root) CMD (echo "root to huang guang da" >> /home/guang/notes/backup_result.log)
Oct 14 22:34:02 com CROND[4215]: (guang) CMD (echo "huang guang da to huang guang da " >> /home/guang/notes/backup_result.log)
Oct 14 22:34:02 com CROND[4216]: (guang) CMD ( echo "huang guang da" >> /home/guang/notes/test_crontab_result.log)
Oct 14 22:34:02 com CROND[4217]: (guang) CMD ( /bin/sh /home/guang/bin/backup.sh)
Oct 14 22:35:01 com CROND[4235]: (guang) CMD (echo "huang guang da to huang guang da " >> /home/guang/notes/backup_result.log)
Oct 14 22:35:01 com CROND[4236]: (guang) CMD ( /bin/sh /home/guang/bin/backup.sh)
Oct 14 22:35:01 com CROND[4237]: (root) CMD (echo "root to huang guang da" >> /home/guang/notes/backup_result.log)
Oct 14 22:35:01 com CROND[4238]: (guang) CMD ( echo "huang guang da" >> /home/guang/notes/test_crontab_result.log)
查看权限
[root@com]/etc# ls -l cron.deny cron.allow
ls: cannot access cron.allow: No such file or directory
-rw-------. 1 root root 0 Mar 31 2016 cron.deny
[root@com]/etc# cat cron.deny
[root@com]/etc#