Linux系统中的 Shell脚本是一个特殊的应用程序.它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释.将需要执行的操作传递给内核执行.并输出执行结果。
常见的Shell解释器程序有很多种,使用不同的Shell 脚本时,其内部指令.命令行提示等方面会存在一些区别。通过/etc/shells文件可以了解当前系统所支持的Shell脚本种类。
#!/bin/bash
# This is my first Shell-Script
cd /boot/
echo "当前目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*
[root@lucky jiaoben]# chmod +x first.sh
运行脚本展示
Linux系统使用文件来描述各种硬件、设备等资源.如以前学过的硬盘和分区.光盘等设备文件。
用户通过操作系统处理信息的过程中.包括以下几类交互设备文件。
标准输入(STDN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执
行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为1.命令将执行后的输出结果发送
到标准输出文件。
5标准错误〈STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信
息发送到标准错误文件。
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上,重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件.
[root@lucky jiaoben]# uname -p > kernel.txt
[root@lucky jiaoben]# cat kernel.txt
x86_64
若重定向输出的目标文件不存在.则会新建该文件.然后将前面命令的输出结果保存到该文件中,若目标文件已经存在.则将输出结果覆盖或追加到文件中。
[root@lucky jiaoben]# uname -r >> kernel.txt
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件.而不是等待从键盘输入。重定向输入使用“<”操作符。
通过重定向输入可以使一-些交互式操作过程能够通过读取文件来完成。
[root@lucky jiaoben]# vim pass.txt
[root@lucky jiaoben]# cat pass.txt
123.123
管道(pipe)操作为不同命令之间的协同工作提供了一种机制.位于管道符号”左侧的命令输出的结果.将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
管道提取之前
[root@lucky jiaoben]# grep "/bin/bash$" /etc//passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
上例中awk命令的作用是以冒号“:作为分隔,输出第1个.第7个区域的字符串。其中的“-F”部分用来指定分隔符号,未指定时.默认以空格或制表符分隔。
管道提取之后
[root@lucky jiaoben]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1 $7}'
root/bin/bash
zhangsan/bin/bash
对于存在多个应用的数据库服务器,备份工作可能会划分得比较细,需要针对不同的库和表.不同的备份路径使用不同的验证用户等。下面以远程备份“青鸟在线”平台的两个论坛数据库为例.备份环境与需求如下所述。
备份主机:IР地址为172.16.16,220,通过机柜内网络连接目标主机。
数据库服务器:IP地址为172.16,16.22,MySQL服务监听的端口为3306。
备份内容:对MySQL服务器中的studydb、coursedb库进行远程备份.每天凌晨2∶30执行.每个库备份为独立的.sql文件,然后压缩为“.tar . gz”格式,文件名中嵌入执行备份时的日期和时刻
mysql> create database studydb;
mysql> create database coursedb;
mysql> grant select,lock tables on coursedb.* to 'operator'@'localhost' idebtified by 'pwd123';
mysql> grant select,lock tables on coursedb.* to 'operator'@'localhost' identified by 'pwd123';
从备份主机中测试数据库访问、查询授权等是否有效.或者直接使用mysqldump备份工具进行测试。
[root@lucky ~]# mysqldump -u operator -p -h localhost --databases studydb > test.sql
Enter password:
在备份主机中,创建用来存放备份文件的目录(如/opt /qnzx_dbbak),并编写相应的备份脚本(如qnzx_dobak , sh),确认能够成功执行备份。脚本代码中,对于目标主机的P地址、用户名.密码、备份路径.文件名等信息.可能会在必要的时候变更。为了方便更新脚本,这些内容最好存放到固定名称的变量中。
[root@lucky ~]# mkdir -p /opt/qnzx_dbbak
[root@lucky ~]# vim qnzx_dbbak.sh
#!/bin/bash
# 这是一个简化的MySQL数据库逻辑备份脚本
# 1.定义数据库连接、目标库信息
MY_USER="operator"
MY_PASS="pwd123"
MY_HOST="localhost"
MY_CONN="-u $MY_USER -p -h $MY_HOST"
MY_DB1="studydb"
MY_DB2="coursedb"
# 2.定义备份目录、工具、时间、文件名主体
BF_DIR="/opt/qnzx_dbbak/"
BF_CMD="/usr/local/mysql/bin/mysqldump"
BF_TIME=`date +%Y%m%d-%H%M`
NAME_1="$MY_DB1-$BF_TIME"
NAME_2="$MY_DB2-$BF_TIME"
# 3.先导出为.sql脚本,然后进行压缩(打包后删除源文件)
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql
/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &> /dev/null
/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &> /dev/null
[root@lucky ~]# chmod +x qnzx_dbbak.sh //添加执行权限
[root@lucky ~]# ./qnzx_dbbak.sh //手动执行备份脚本
[root@lucky ~]# ll /opt/qnzx_dbbak/
总用量 8
-rw-r--r-- 1 root root 622 12月 18 16:20 coursedb-20231218-1620.tar.gz
-rw-r--r-- 1 root root 621 12月 18 16:20 studydb-20231218-1620.tar.gz
有了批量备份的Shell脚本以后.接下来可按照备份要求设置计划任务,以便自动、定期执行备份操作。在crontab配置记录中,直接指定qnzx_dbbak , sh脚本程序的路径作为执行命令。
[root@lucky ~]# mv qnzx_dbbak.sh /opt/qnzx_dbbak/
[root@lucky ~]# crontab -e
55 17 * * * /opt/qnzx_dbbak/qnzx_dbbak.sh
[root@lucky ~]# systemctl status crond //确保crond服务已运行
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 一 2023-12-18 17:57:13 CST; 1h 31min ago
Main PID: 9294 (crond)
Tasks: 1
CGroup: /system.slice/crond.service
└─9294 /usr/sbin/crond -n
12月 18 17.57:13 lucky systemd[1]: Started Command Scheduler.
12月 18 17:57:13 lucky crond[9294]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 40% if used.)
12月 18 17:57:14 lucky crond[9294]: (CRON) INFO (running with inotify support)