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
相關文章
相關標籤/搜索