Linux定时任务和Shell

[TOC]目录 目录生成脚本地址:www.jianshu.com/p/caa21e679…mysql

##1、Linux中Shellsql

一、Shell是什么

Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,能够用Shell来启动、挂起、中止、编写一些程序。shell

二、Shell脚本的执行方式

脚本格式要求数据库

  • 脚本以 #!/bin/bash 开头
  • 脚本须要有 执行权限

范例vim

#!/bin/bash
echo "hello world!"
复制代码

执行方式bash

  • 方式一
    • 给 xx.sh 赋予 +x 的权限
    • 执行脚本
  • 方式二
    • sh xx.sh

1.Shell变量

  • 变量分为:系统变量和自定义变量。
  • 系统变量:【$HOME]、$PWD 、$USER 等 : 区分大小写
  • 显示当前 shell 中全部变量 : set

定义函数

  • 定义变量:变量=值
  • 撤销变量:unset 变量
  • 申明静态变量:readonly 变量, 不能执行 unset

2.变量定义规则

  • 变量由 字母、数字、和下划线组成,不能以 数字开头。
  • 等号两侧不能有空格
  • 变量名称通常大写

==使用 ``==ui

A=`ls -la` :把执行结果 返回给变量 A
====================
A=$(ls -la)
复制代码

3.设置环境变量

  • export 变量名=变量值:将shell变量输出为环境变量
  • export 配置文件:让修改后的配置文件生效
  • export $变量名:查询环境变量的值

位置参数变量spa

$n :$0 表明 命令自己;$1 – $9 :第一个到第九个参数,10及以上的参数,用 ${10}命令行

$* :表明命令行中的全部参数, 当作一个总体

$@ :表明命令行中的全部参数,会把每一个参数区分开

$# :表明命令行中全部参数的个数

echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"
================
./position.sh 30 60
30 60
30 60
参数个数=2
复制代码

预约义变量

Shell中已经定义好的变量,能够直接使用

:当前进程的PID

$!:后台运行的最后一个进程的PID

$?:最后一次执行的命令的返回状态。若是为0,表示上一个命令正确执行。

#### 4.Shell运算符

- $((运算符)) || \$[运算符]
- expr m + n : 运算符之间 有空格
- expr m - n

- 计算 (2+3)*4

```
#!/bin/bash
echo "hello"
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
RESULT2=$[(2 + 3) * 4]
echo "result2=$RESULT2"
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"
```

#### 5.Shell判断语句

[ condition ] :condition先后有空格

- [ 1 ] :true
- [] : false
- [ condition ] && echo 123 || echo 234

#### 6.经常使用判断条件

- 数字的比较

| =    | 字符串比较 |
| ---- | ---------- |
| -lt  | 小于       |
| -le  | 小于等于   |
| -eq  | 等于       |
| -gt  | 大于       |
| -ge  | 大于等于   |
| -ne  | 不等       |

- 按照文件权限判断

| -r   | 有读的权限   |
| ---- | ------------ |
| -w   | 有写的权限   |
| -x   | 有执行的权限 |

- 按照文件类型判断

| -f   | 文件存在而且是一个常规文件 |
| ---- | -------------------------- |
| -e   | 文件存在                   |
| -d   | 文件存在且是一个目录       |

### 三、Shell流程控制

#### If 语句

```
if [ condition ]
	then XXX
elif [ condition ]
	then xxx
fi
```

**示例**

```
if [ "ok" = "ok" ]
	then echo "ok==ok"
fi

if [ 23 -gt 22 ]
	then echo "gt"
fi

if [ -e /root/shell/aaa.txt ]
	then echo "exist"
fi
```

#### case 语句

```
case $变量名 in
"值1")
	echo "aaa";;
"值2")
	echo "bbb";;
*)
	echo "ccc";;
esac
#!/bin/bash
case $1 in
"1")
        echo "aaa";;
"2")
        echo "bbb";;
*)
        echo "ccc";;
esac
------------------
./xx.sh 1
```

#### for 语句

```
for 变量 in 值1 值2 值3 ....
do
	xxxx
done

for ((初始值; 循环控制条件;变量变化))
do
	xxxx
done
```

**示例**

```
for i in "$*"
do
	echo "num is $i"
done
# 只会打印一次,全部参数当成一个
===================
for j in "$@"
do
	echo "num is $J"
done
# 多个参数会打印多行
#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
        SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
```

#### while语句

```
while [ condition ]
do
	xxxx
done
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "SUM=$SUM"
```

#### Shell输入输出

```
read (选项)(参数):从控制台读取数据
-p:指定读取值时的提示符
-t:指定读值的等待时间【单位:秒】,超时不等待

参数:指定读取值的变量名
#!/bin/bash

read -p "input a number:" NUM1
echo "num1=$NUM1"

read -t 5 -p "在5秒内,输入一个数num=" NUM2
echo "num=$NUM2"
```

#### Shell函数

#### 系统函数

1)basename:返回完整路径最后 / 的部分,经常使用于获取文件名

basename [pathname] [suffix]

```
basename /home/aaa/test.txt => test.txt
basename /home/aaa/test.txt .txt => test
```

2)dirname:返回完整路径最后 / 的**前面**部分,经常使用于获取路径

dirname 文件绝对路径

```
diename /home/aaa/test.txt ==>/home/aaa
```

#### 自定义函数

**语法**

```
[function] funcName[()]
{
    action;
    [return int;]
}
```

**示例**

```
function getSum() {
    SUM=$[$n1 + $n2]
    echo "sum=$SUM"
}
read -p "first num1=" n1
read -p "second num2=" n2

getSum $n1 $n2
```

#### 案例

需求:

- 天天凌晨 2 点 0分,备份数据库 testdb 到 /data/backup/db
- 备份开始和结束给出提示信息
- 备份好的文件要求以 备份时间为文件名,并打包 .tar.gz 格式:2019-02-23-09-02-01.tar.gz
- 同时检查 是否有超过10天的备份文件,有就执行删除操做

```
# 数据库定时备份 脚本
BACKUP_PATH=/data/backup/db
DATETIME=$(date +%Y-%m-%d-%H-%M-%S)
# echo "date=$DATETIME"

echo "========备份开始========="
echo "========备份路径=$BACKUP_PATH/$DATETIME.tar.gz==========="

HOST=localhost
USER=root
PWD=root
DB=testdb

# 若是路径不存在就新建
[ ! -d "$BACKUP_PATH/$DATETIME" ] && mkdir -p $BACKUP_PATH/$DATETIME

# 执行备份命令
mysqldump -u$USER -p$PWD --host=$HOST $DB | gzip > $BACKUP_PATH/$DATETIME/$DATETIME.sql.gz

cd $BACKUP_PATH
tar -zcvf $DATETIME.tar.gz $DATETIME

# 删除临时文件
rm -rf $BACKUP_PATH/$DATETIME

# 找10天前文件,并删除
find $BACKUP_PATH -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;

# 输出备份结束信息
echo "==========备份成功==========="
```

- crontab -e
- 0 2 * /xxx.sh



##2、Linux定时任务调度

#### crond任务调度

 系统在某个时间段执行特定的命令或程序。

一、数据库的定时备份操做。

二、系统一些重复工做,病毒扫描等。

**用法**

crontab 【选项】

-e:编辑crontab定时任务

-l:查询crontab任务

-f:删除当前用户全部的crontab任务

-r:终止任务调度

service crond restart:重启任务调度

```
crontab -e
*/1 * * * * ls -l /etc > /tmp/to.txt  -- 每小时的每分钟执行
```

- 第一个*:一小时中的第几分钟【0-59】
- 第二个*:一天中的第几个小时【0-23】
- 第三个*:一个月当中的第几天【1-31】
- 第四个*:一年中的的第几月【1-12】
- 第五个*:一周当中对的星期几【0-7 0和7都表示 周日】

| 特殊符号 | 说明                                                 |
| -------- | ---------------------------------------------------- |
| *        | 表明任意时间                                         |
| ,       | 不连续的时间范围,0 8,12,15 *,天天八、十二、15点执行。 |
| -        | 连续的时间范围,0 5 1-6,周一到周六的凌晨5点执行。   |
| */n      | 每隔多久执行一次,*/10* *,每隔10分钟执行一次。      |

**示例**

| 示例         | 含义                                           |
| ------------ | ---------------------------------------------- |
| 45 22 *      | 天天22点45分执行                               |
| 0 17 1       | 每周一的17点0分执行                            |
| 0 5 1,15     | 每个月一、15号的凌晨5点0分执行                    |
| 40 4 1-5     | 每周一到周五凌晨4点40分执行                    |
| */10 4*      | 天天凌晨4点,每隔10分钟执行一次。5点就不执行了 |
| 0 0 1,15 * 1 | 每个月一、15号、每周一的0点0分执行                |

#### 实际操做

一、每隔1分钟,当前日期信息,写入 文件中。

- vim /home/wsw/mytask1.sh
  - date >> /home/wsw/dates.txt
- 给mytask1.sh 执行权限
  - chmod 744 /home/wsw/mytask1.sh
- crontab -e
- */1* * /home/wsw/mytask1.sh

二、天天凌晨2点,mysql数据库 testdb、备份。

- vim /home/wsw/mytask2.sh
  - /usr/local/mysql/bin/mysqldump -u root -proot testdb > /tmp/db.bak
- chmod 744 /home/wsw/mytask2.sh
- crontab -e
- 0 2 * /home/wsw/mytask2.sh
相关文章
相关标签/搜索