时间任务与shell脚本

atd服务,一次性时间任务(只能定时某一分钟的0秒,如果想定时在某一秒,可以使用shell脚本)

# ps -ef | grep atd           --查看at服务是否开启
# systemctl start atd          --启动atd服务
# systemctl enable atd           --设置为开机自启动
 
如果报未能识别的服务,说明没有安装:
# yum install -y at
 
atd服务使用格式:
 
# at 14:14 102016          --在2016年10月20日的14点14分执行一个任务
at> mkdir /testat
at> touch /testat/`date +%T`
at> <EOT>          --输入完成后按下 ctrl+d 结束
job 1 at 2016-09-23 14:14     --job 1表示一个时间任务编号,这里是指系统的第一次at任务,所以为1,后面是定时任务执行的时间
 
at时间任务命令选项:
 
-l     列出at任务  可直接使用# atq
-d     删除at任务  可直接使用# atrm [时间任务编号]
-c     查看任务内容
-f      后面加<文件> 从指定文件读取任务
 
如:
# at -l          --列出当前系统中未执行的at时间任务 (或 # atq)
3     2014-07-24 15:25 a root
4     2014-07-25 14:25 a root
6     2015-07-24 14:25 a root
# at -d 3       --删除at时间任务中编号为3的时间任务(或 # atrm 3)
# atq               --删除后在查看一次还未执行的at时间任务
4     2014-07-25 14:25 a root
6     2015-07-24 14:25 a root
 
如果你要做的事步骤比较多,则先写成脚本,然后使用at进行调用(-f 选项实例)
at -f xxx.sh
 
# vim /tmp/1.sh
#!/bin/bash
echo 1 > /dev/pts/1
echo 2 > /dev/pts/1
echo 3 > /dev/pts/1
 
# at now + 1 minutes -f /tmp/1.sh      --当前时间+1分钟后执行/tmp/1.sh
job 2 at 2014-07-24 14:26
 
# at now + 1 hours -f /tmp/1.sh      --当前时间+1小时后执行/tmp/1.sh
job 3 at 2014-07-24 15:25
 
# at now + 1 days -f /tmp/1.sh       --当前时间+1天后执行/tmp/1.sh 
job 4 at 2014-07-25 14:25
 
# at now + 1 months -f /tmp/1.sh       --当前时间+1个月后执行/tmp/1.sh 
job 5 at 2014-08-24 14:25
 
# at now + 1 years -f /tmp/1.sh       --当前时间+1年后执行/tmp/1.sh 
job 6 at 2015-07-24 14:25
 
at时间任务中的时间可以使用AM、PM表示
AM(上午时间)
PM(下午时间)
如:
# at 11.10 pm               --今天下午11点10分执行
 
# at 9am tomorrow          --明天上午9点执行
 
还有更多命令格式,请自行查阅at时间任务手册: # man at
 
# ls /var/spool/at/     --这个目录会看到有三个可执行文件, cat去看与at -c 任务号看到的结果一样
 
/etc/at.deny          --at任务黑名单,这个文件控制哪些普通用户不可以使用at服务
 
at时间任务扩展指令“batch”
 
batch为,at命令的特殊版本,在执行的任务会占用大量资源的时候用,只在cpu需求低于cpu能力80%的时候使用
# batch 11:00
at> tuoch /testat/`date +%T`
一样使用 ctrl+d 结束
 
batch创建的任务也是通过atq查看,atrm删除

 crond 周期性执行时间任务

作用:
如果我们想要在每一天的某一个时间段让系统自动完成我们想要完成的任务时即可使用!
使用方法:
直接在该服务的配置文件中进行修改即可
配置文件路径: /etc/crontab
 
# systemctl start crond               --启动服务
# systemctl enable crond          --开机启动服务
 
# vim /etc/crontab                    --周期性时间任务主配置文件
 
     SHELL=/bin/bash                    指定系统要使用哪个shell
     PATH=/sbin:/bin:/usr/sbin:/usr/bin          指定系统执行命令的路径
     MAILTO=root                    执行信息将通过电子邮件发送给root用户
     HOME=/                         指定在执行命令或者脚本时使用的主目录                   
 
     # 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
       分 时 日 月 周
 
*代表每分,每小时,每天。。。。。。
,代表分隔的时间,如1,3,7      1点3点7点
-代表连续的时间,如2-10     2到10点
*/2 代表每2隔两分钟、每2隔小时    
 
例1:
# vim /etc/crontab
# 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
  *  *  *  *  *    root           echo heihei > /dev/pts/5
  时间              使用的用户名          需要执行的任务
 
表示每一分钟使用root用户执行一次 echo heihei > /dev/pts/5 命令
    
例3:
# vim /etc/crontab
* * * * * root sh /tmp/1.sh
表示每一分钟都去/tmp目录下将1.sh执行一次,保存退出后即可生效,无需重启服务
 
# vim /tmp/1.sh          --脚本需要x执行权限,否则系统将无法自动执行
 
#!/bin/bash
echo haha > /dev/pts/5
 
# chmod 755 /tmp/*    
 
crontab命令
 
crontab命令使用格式:
# crontab [-u user] 选项
 
命令常用选项:
-u 用户名。
-e 编辑crontab文件。
-l 列出crontab文件中的内容。
-r 删除crontab文件。
 
列出crontab文件
# crontab -l
 
编辑crontab文件
.
# crontab -e               --每个用户都可以这样创建自己的时间任务
01 21 * * * /sbin/init 0          --因为用什么用户操作就是什么用户的身份,所以这里不用写用户身份
# crontab -u user1  -e             --编辑user1用户的时间任务
你不使用crontab -e,直接去修改下面的目录里的对应的用户名的文件也是一样
/var/spool/cron/
 
删除crontab文件
# crontab -r
 
创建一个crontab文件
# touch /tmp/cronfile                    --手动创建该文件
# echo "* * * * * echo 1 > /dev/pts/2" >> /tmp/cronfile     --想新建好的crontab文件追加内容
# crontab /tmp/cronfile                    --启用新建的crontab文件
 
crontab使用者权限文件
文件:/etc/cron.deny
说明:该文件中所列用户不允许使用crontab命令(黑名单)
 
文件:/etc/cron.allow
说明:该文件中所列用户允许使用crontab命令(白名单)
 
文件:/var/spool/cron/
说明:所有用户crontab文件存放的目录,以用户名命名
如:/var/spool/cron/user1     user1这个文件就是user1这个用户的crontab文件

1、ps命令查看系统中运行的进程信息。

ps [选项]                                   

常用选项:

-a           显示终端上的所有进程,包括其他用户。

-e           显示系统中所有的进程信息(可用“-A”替代)。
-f            显示进程的所有信息。
-l            以长格式显示进程信息。

-u           显示面向用户的格式信息。

-x           显示没有控制终端的进程。

示例:

ps -aux|grep java                      

显示java 进程的所有状态。 

ps命令输出字段名说明

进程号(PID)、内存使用率(%MEM)、虚拟内存占用情况(VSZ)、物理内存占用情况(RSS)、登录的终端控制台(TTY,其中“?”表示未知)、当前进程状态(STSAT)、进程开始时间(START)、进程运行时间(TIMS)、进程名称(COMMAND)、执行进程的命令(CMD)

 

当前进程状态(STSAT)的几种形态

R       (TASK_RUNNING):可执行状态。

S       (TASK_INTERRUPTIBLE):可中断睡眠状态。

D       (TASK_UNINTERRUPTIBLE):不可中断睡眠状态。

T       (TASK_STOPPED or TASK_TRACED):暂停或者跟踪状态

Z       (TASK_DEAD-EXIT_ZOMBIE):退出状态,进程成为僵尸进程。

X       (TASK_DEAD-EXIT_DEAD):退出状态,进程即将被销毁。 

2、kill命令使用进程号来结束指定进程的运行。

 

-l            列出所有kill命令的选项

 

-2           中断(同ctrl+c)

 

-3           退出(同ctrl+\)

 

-15         终止

 

-9           强制终止(常用)

实例:

为了查看指定进程的进程号,可以使用管道操作和grep命令相结合的方式实现。

比如查看xinetd进程对应的进程号:

ps -e|grep xinted                     

例如,输出为:

1665 ? 00:00:00 xinted          

从其输出信息中,可得知该进程的进程号为1665。若要结束改进程,则执行命令:

kill 1665                                 

3、killall命令使用进程名来结束指定进程的运行。若系统存在同名的多个进程,则这些进程将全部结束运行。

kilall [-9] 进程名                      

选项“-9”用于强行结束指定进程的运行,属于非正常结束。

实例,若要结束xinetd进程的运行,则实现命令为:

kilall xinetd                            

linux中后台进程

用户输入shell命令后,空格加上“&”符号再按Enter就会启动一个后台进程。此时shell可以继续运行和处理其他程序命令。

 

shell脚本的执行
1、当脚本文件本身没有可执行权限(文件x位为-号位)
           bash script-name或 sh script-name  
2、路径+脚本名
         . /path/script-name 
3、在当前shell脚本中加载另一个shell脚本
       source  /path/script-name   或 .  /path/script-name          (点号与脚本名之间有空格)
 

shell变量
1、变量的定义
                格式:变量名=值 
                         变量名=变量
                变量名要求:字母开头,由字母、数字、下划线组成。
2、位置变量:通过命令行给程序传递执行参数。
            ./script-name 参数1 参数2 参数3     
     $n             取当前执行shell脚本的第n个参数值,n=1~9,如果n>9,用大括号括起来,如${10}         ${10}就等于shell脚本第10个参数值。
     $@             这个程序中所有参数。(这是将参数传递给其他程序的最佳方法,因为它会保留所有内嵌在每个参数里的空白)。

3、Bash预定义变量
     $?              获取上一个执行命令的返回值(0为成功,非零为执行命令未成功)。
     $$              获取当前shell脚本的进程号(PID)。

     $#             获取当前shell脚本命令行中参数的总个数。

     $0            (n=零时)取脚本路径和名称。

     $*             所有位置参数的内容。

4、shell数组的定义

 语法有默认下标形式:array=(value1 value2 value3 ...)   和key-value 键值对形式 :array=([1]=one [2]=two [3]=three ...)
例如:
    # abc=( 1 2 a b "sfsda sf sfdsa" )    --定义一个数组,可以是数字,字母,或者字符串
    # echo ${abc[0]}    -------数组的默认下标是从0开始不是1
    1
    # echo ${abc[1]}
    2
    # echo ${abc[3]}
    b
    # echo ${abc[4]}
    sfsda sf sfdsa
 
查看数组的全部值
echo ${abc[*]}   或   echo ${abc[@]} 
 
查看数组的个数
 echo ${#abc[*]}
 
 动态数组
    # array3=(`ifconfig ens33|grep broadcast`)
    # echo ${array3[0]}
    inet
    # echo ${array3[1]}
    addr:10.1.1.35
 
数组的赋值
array[0]=h123   #会将原来的array[0]的值覆盖掉
 
数组的删除(数组的本质还是变量)
uset 数组[下标]
 
echo ${array[2]} | cut -d: -f2

 

if条件语句

              if [ $? -eq 0]        #上一个命令执行后的返回值是否等于0;if [ $? -ne 0 ]上一个命令执行后的返回值是否不等于0

              then 

                    #指令

              fi   

while循环按行读文件的方式 

cat file_path | while read line

do

      #执行命令

done

while死循环
           while true
           do
                  #执行命令
           done

for循环列表取值循环

for 变量 in 变量取值列表

do

      #执行命令

done

for循环与while循环的按次数循环,跟C语言类似

for((i=1;i<=10;i++))

do

    (  #while循环

       a=1

        while((a<=4))

         do

              e=$a

                echo "a=$e"                  #这里并不会赋值
                ((a++))
         done

      )

done

 函数定义
   
 function menu(){
           echo 'helloward,bash!';
    }

shell脚本字符输出,颜色控制

  echo -e "\033[30;47m test \033[0m"      

case条件语句

例: 写一个shell脚本,传入一个参数(字母),判断传入的字母是大小还是小写

#!/bin/bash
echo "请输入单个字母!"  
read $1                #读取从键盘的输入
######################################################
    case "$1" in
         [A-Z] )
         echo "大写"
         ;;
         [a-z] )
         echo "小写"
         ;;
         * )
         echo "不是字母"
         exit 1
    esac

 shell脚本调试

 -n选项只做语法检查,而不执行脚本。
sh -n script_name.sh     

 跟踪调试

 sh -x script_name.sh    
进入调试模式后,Shell依次执行读入的语句,产生的输出中有的带加号,有的不带,带加号表示该条语句是Shell执行的。不带加号表示该语句是Shell产生的输出。
在调试过程中可以按Ctrl + Z中断调试,观察结果,然后再按fg键继续调试即可。

 

break、continue、exit、return的区别

break n         #如果省略n,表示跳出整个循环,n表示跳出循环的层数。

continue n      #如果省略n,表示跳过本次循环,n表示跳到第n层继续循环。

exit n               #退出当前shell程序,n可以省略,n为本程序退出后返回的参数,也可以在下一个shell里通过 “$?” 接收 exit n 的 n 值

return n          #用于在函数里,n 作为函数的返回值。以在下一个shell里通过 “$?” 接收 retern n 的 n 值

把shell脚本改选成标准rpm脚本:

#!/bin/bash
#script-name

#chkconfig:2345 90 20   
#description: script-name server daemon

通过service命令脚本进行开启和关闭:
linux的快捷目录:/etc/rc.d/init.d
  service script-name start|stop|restart     

通过chkconfig命令把shell脚本设置开机自启:
   查看:chkonfig --list script-name  
   设置:chkconfig script-name on
            chkconfig script-name off

编写脚本(shell 或 python)

systemctl命令代替了:service(服务)、chkconfig(开机启动)、crontab(定时)
systemctl命令用法示例:
systemctl enable mysqld     #设置mysql为开机自启动
systemctl stop mysqld        #停止运行 mysql 数据库
 
CPU:top命令、htop命令
 
内存:top命令、htop命令、free -h
 
磁盘:df命令、iotop(检查磁盘io消耗)
 
网络:iftop命令
 
进程:top命令、htop命令、ps命令
 
1、如何监控内存使用情况
正常使用情况:内存使用率高于80%
异常使用情况:内存使用率低于20%
则发送警报
提示:
free -h|awk 'NR==2{print ($NF/$2*100)"%"}'
 
2、如何检查服务运行状态
ps -ef|grep -c (n)ginx
netstat -lntup|grep xxxx
PS:tomcat服务---僵死状态,需要模拟用户真实访问,才能检查出来。
 
3、
#!/bin/bash
# 普通date格式会跟随系统字符集,可能会出现英文,所以用date -R
#删除iptables规则:iptables -D INPUT -s $IP -j DROP
 
DATE=$(date -R|awk -F'[ :]+' 'NR==1{print $2"/"$3"/"$4":"$5":"$6}')
 
SED_NUM=100
 
LOG_FILE=/usr/local/nginx/logs/access.log
 
ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE|awk -v sed_num=$SED_NUM '{a[$1]++}END{for(i in a)if(a[i]>sed_num)print i}')
 
for IP in $ABNORMAL_IP;do
 
if [ $(iptables -vnL|grep -c "$IP") -eq 0 ];then
 
iptables -I INPUT -s $IP -j DROP
 
echo "$DATE $IP" >>/tmp/drop_ip.log
 
fi
 
done

VIM的ordinary模式

Ctrl+g查看文件信息

括号
光标停在一半括号下,按下%键,快速找到另一半括号。

复制

yy            复制光标所在的当前行。

nyy          n为数字,表示复制从光标开始向下的n行。

粘贴
在VIM下,删除命令不会直接将你的东西删除,而是放到VIM的寄存器中。所以先删除,后粘贴。
小写p       将已复制的数据粘贴到光标之后。
大写P       将已复制的数据到光标之前。

删除
dd           删除光标所在行。

ndd         n为数字,删除从光标开始向下的n行。
dgg         删除光标所在到文件开头。
dG          删除光标所在行到文件末尾。


motion范围符
                           gg:使光标位于文件开头。
                            G:使光标位于文件末尾。
                            e:使光标为于所在单词的起始处。
                            b:使光标为于所在单词的末尾。
                            ^:使光标位于所在行的行首。
                            $:使光标位于所在行的行尾。

                 数字+motion=执行多个motion

                 d+数字+motion=删除多个motion范围


撤销
u   表示撤销最后一次修改。
U   表示撤销对整行的修改。
Ctrl+r   快捷键可以恢复撤销的内容。

posted @ 2017-03-15 13:21  兰昌  阅读(3180)  评论(0)    收藏  举报