linux定时执行shell脚本
写一个shell脚本,定时执行简单示例
很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据、数据库数据等 不适合人工经常做的一些操作这里简单说下
Shell俗称壳,类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
我的虚拟机是centos7.0.2
接下来 写一个简单的shell命令:
1.先进入根目录
cd /root
2.使用vi编辑器 可以直接 # vim hello.sh编写第一个shell文件 hello.sh, 注意一定要以.sh结尾
vim hello.sh
这是一个执行脚本,监测CPU,内存,以及硬盘情况的
内存使用情况
- 总内存数量
- 已使用内存数量
- 真正尚未被使用的物理内存数量
- 无
- 缓存内存数量
- 应用程序认为可用内存数量
CPU使用情况 - 显示在用户级别(application)运行使用 CPU 总时间的百分比
- 显示在用户级别,用于nice操作,所占用 CPU总时间的百分比
- 在核心级别(kernel)运行所使用 CPU总时间的百分比。
- 显示用于等待I/O操作占用 CPU总时间的百分比
- 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
- 显示 CPU空闲时间占用 CPU总时间的百分比。
磁盘使用情况 - 总容量
- 已用容量
- 使用率
PU、磁盘、内存使用率
system=0
user=0
i=0
#log="/usr/local/shell/checklinuxlog.txt"
str=$(date +%Y%m%d)
log="/opt/txts/$str.txt"
#dada=$(date +%Y%m%d%H:%M:%S)
dada="`date +%Y-%m-%d_%H:%M`"
#内存使用情况
#总内存数量
total=$(free -m | awk 'NR==2' | awk '{print $2}')
#已使用内存数量
used=$(free -m | awk 'NR==2' | awk '{print $3}')
#真正尚未被使用的物理内存数量
free=$(free -m | awk 'NR==2' | awk '{printf $4}')
#
shared=$(free -m | awk 'NR==2' | awk '{printf $5}')
#缓存内存数量
bufforcache=$(free -m | awk 'NR==2' | awk '{print $6}')
#应用程序认为可用内存数量
available=$(free -m | awk 'NR==2' | awk '{print $7}')
#echo "$dada 内存使用率:$total-$used-$free-$shared-$bufforcache-$available" >> $log
#CPU使用情况
cpus=$(sar -u 1 5 | awk 'NR==9' | awk -F " " '{print $3"-"$4"-"$5"-"$6"-"$7"-"$8 }')
#echo "$cpus" >> $log
#磁盘使用情况(注意:需要用sed先进行格式化才能进行累加处理)
disk_warning=`df -h | awk -F " " '{print $2"-"$3"-"$5"-"$6}' | sed ':a ; N;s/\n/##/ ; t a ; '`
#echo "$dada 磁盘利用率:$disk_totalSpace-$disk_used-$disk_percent1.$disk_percent2%" >>$log
echo "$dada|$cpus|$total-$used-$free-$shared-$bufforcache-$available|$disk_warning" >> $log
#目的地服务器
server="deployer@172.27.114.33"
#本机服务器地址
#内网
ips=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
#外网
#ips=`curl 'icanhazip.com'`
#上传目的地服务器绝对路径
destiny="/opt/ips/$ips"
#查看上传目的地是否存在路径,不存在就创建,并且使用scp上传文件
ssh "$server" "mkdir -p $destiny" && scp -r "$log" "$server:$destiny"
3.编写第一个shell文件,#!/bin/bash 是必须要写的,表示要是/bin/bash这个执行脚本的命令执行接下来写的脚本, echo "hello world !!"表示想前端打印一句话,具体看各自需求。
4.通过chmod命令赋予该脚本的执行权限chmod 755 hello.sh,否则没有执行权限,/root/hello.sh表示在全路径下执行该shell脚本
就此一个简单的shell脚本就这样写完了 具体的这里就不讲了。(说白了,shell脚本就相当于一个文件,它专门来干自己独立的任务)
虽然一个简单的shell脚本写完了 但是运行后只能执行一次 对很多应用场景来说还是不够,接下来说一下定时任务
linux应该都有crontab,没有的话可以安装一下:
yum install vixie-cron
yum install crontabs
vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
安装完以后开启crontab服务
service crond start
CentOS6上的cron命令
用以下的方法启动、关闭这个cron服务:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
查看crontab服务状态:service crond status
手动启动crontab服务:service crond start
CentOS7上的cron命令
systemctl start crond.service //启动服务
systemctl stop crond.service //关闭服务
systemctl restart crond.service //重启服务
systemctl reload crond.service //重新载入配置
systemctl status crond.service //查看状态
//或者
crond start
crond stop
crond restart
crond reload
crond status
有可能出现重复调用脚本问题,原因是crontab启动了两个,查看方式为:
ps -ef|grep crond|grep -v grep
看看是否服务器上启动了多个crond进程导致的,root重启一下crond就OK了。
查看crontab服务是否已设置为开机启动,执行命令:ntsysv
加入开机自动启动:
chkconfig –level 35 crond on
也可以用设置开机自动启动crond服务:
[root@CentOS ~]# chkconfig crond on
查看各个开机级别的crond服务运行情况
[root@CentOS ~]# chkconfig –list crond
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
可以看到2、3、4、5级别开机会自动启动crond服务
取消开机自动启动crond服务:
[root@CentOS ~]# chkconfig crond off
设置需要执行的脚本
新增调度任务可用两种方法:
1)、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2)、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。
crontab -e配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务
查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出用户jp的所有调度任务
删除任务调度工作
crontab -r //删除所有任务调度工作
直接编辑 vim /etc/crontab ,默认的文件形式如下:
*/1 * * * * root /usr/local/shell/checklinux.sh
前四行是有关设置cron任务运行的环境变量。
SHELL变量的值指定系统使用的SHELL环境(该样例为bash shell),
PATH变量定义了执行命令的路径。Cron的输出以电子邮件的形式发给MAILTO变量定义的用户名。
如果MAILTO变量定义为空字符串(MAILTO=""),电子邮件不会被发送。执行命令或脚本时HOME变量可用来设置基目录。
文件/etc/crontab中每行任务的描述格式如下:
minute hour day month dayofweek command
minute - 从0到59的整数
hour - 从0到23的整数
day - 从1到31的整数 (必须是指定月份的有效日期)
month - 从1到12的整数 (或如Jan或Feb简写的月份)
dayofweek - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
command - 需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)
root表示以root用户身份来运行
run-parts表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本
对于以上各语句,星号()表示所有可用的值。例如在指代month时表示每月执行(需要符合其他限制条件)该命令。
整数间的连字号(-)表示整数列,例如1-4意思是整数1,2,3,4
指定数值由逗号分开。如:3,4,6,8表示这四个指定整数。
符号“/”指定步进设置。“/”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如*/3用来运行每三个月份运行指定任务。
以“#”开头的为注释行,不会被执行。
比如上述图中 执行的是每隔一分钟执行一半hello.sh脚本 上边脚本输出的内容 大家也知道 >> 符号 指定文件获取内容的存放位置 比如访问一个地址 命令 curl http://www.baidu.com
linux系统字符界面 无法显示画面只能把访问的页面编译后的代码原样输出 如:
这样大家看着很乱吧
当然也有-I 参数 静默访问 curl -I http://www.baidu.com
这样只显示一组http状态 但还是很乱 直接把他写进固定的日志文件就方便多了
cat 一下 查看 这样就简单多了
就此一个简单的定时任务就完成了