Day1 备份文件
shell脚本一天一练-day1_哔哩哔哩_bilibili
题目:
写一个脚本,遍历/data/目录下的txt文件
将这些文件做一个备份
备份的文件名增加一个年月日的后缀,比如aming.txt备份为aming.txt_20241203
#!/bin/bash
# create file first
touch /data/{1..100}.txt
suffix=`date +%Y%m%d`
for file in `find /data/ -type f -name "*.txt"`
do
echo "back up file $file to ${file}_${suffix}"
cp -f ${file} ${file}_${suffix}
done总结:
- date命令用法
- for循环遍历文件
Day3 检测磁盘分区读写是否正常
题目:
写一个检测脚本,用来检测本机所有磁盘分区是否读写正常
note:可以遍历所有挂载点,然后新建一个测试文件
然后再删除测试文件,如果可以正常创建和删除,那说明该分区没问题
#!/bin/bash
# iterate all the mounts and check if we can create and del files
:'
df
Filesystem 1K-blocks Used Available Use% Mounted on
none 8148136 0 8148136 0% /usr/lib/modules/5.15.167.4-microsoft-standard-WSL2
none 8148136 4 8148132 1% /mnt/wsl
drivers 467731452 53237236 414494216 12% /usr/lib/wsl/drivers
/dev/sdc 1055762868 4183164 997876232 1% /
none 8148136 76 8148060 1% /mnt/wslg
none 8148136 0 8148136 0% /usr/lib/wsl/lib
rootfs 8144724 2208 8142516 1% /init
none 8148136 784 8147352 1% /run
none 8148136 0 8148136 0% /run/lock
none 8148136 0 8148136 0% /run/shm
tmpfs 4096 0 4096 0% /sys/fs/cgroup
none 8148136 76 8148060 1% /mnt/wslg/versions.txt
none 8148136 76 8148060 1% /mnt/wslg/doc
C:\ 467731452 53237236 414494216 12% /mnt/c
D:\ 1024657404 234654208 790003196 23% /mnt/d
E:\ 460799996 161848 460638148 1% /mnt/e
tmpfs 1629624 20 1629604 1% /run/user/0
df | sed '1d' | grep -v none | grep -v :\ | grep -v tmpfs | awk '{print $NF}'
/usr/lib/wsl/drivers
/
/init
/mnt/c
/mnt/d
/mnt/e
'
for mount_p in `df | sed '1d' | grep -v none | grep -v :\ | grep -v tmpfs | awk '{print $NF}'`
do
echo "check mount point $mount_p"
touch $mount_p/testfile && rm -f $mount_p/testfile
if [ $? -ne 0 ] # remember here we need space
then
echo "mount point $mount_p has problems!"
else
echo "mount point $mount_p is ok!"
fi
done总结:
- && 连接符只有前面的命令执行成功了才会执行后面的命令。在本例中,只有两条命令都执行成功返回值才是0
Day4 检查文件
题目:检查/data/wwwroot/app/目录下的所有文件,看是否满足下列条件:
1)所有文件权限为644
2)所有目录权限为755
3)文件和目录所有者为www,所属组为root
如果不满足,改成要符合的要求
注意:不要直接修改权限,一定要有判断的过程
<em>#</em><em>!/bin/bash</em>
cd /data/wwwroot/app
<em>if</em> [ $? -ne 0 ]
<em>then</em>
exit 1
<em>fi</em><em>for</em> file <em>in</em> `find .`
<em>do</em><em># authority</em>
file_authority=`stat -c %a $file`
<em># owner</em>
file_owner=`stat -c %U $file`
<em># group</em>
file_group=`stat -c %G $file`
<em>if</em> [ -d $file ]
<em>then</em>
[ $file_authority != '755' ] && chmod 755 $file
<em>else</em>
[ $file_authority != '644' ] && chmod 644 $file
<em>fi</em>
[ $file_owner != 'www' ] && chown www $file
[ $file_group != 'root' ] && chown :root $file
<em>done</em>总结:
- stat相关
查看文件权限: stat -c %a 1.txt
查看文件所有者:stat -c %G 1.txt
查看文件所属组:stat -c %U 1.txt
- &&: 前面命令执行成功再执行后面命令
- ||:前面命令不成功再执行后面命令
Day 7 找5分钟内更改的文件
题目:
有一台服务器作为web应用,有一个目录(/data/web/attachment) 不定时地会被用户上传新的文件,但是不知道什么时候会上传。
所以,需要我们每5分钟做一次检测是否有新文件生成。
写一个shell脚本去完成检测。检测完成后若是有新文件,还需要将新文件的列表输出到一个按年、月、日、时、分为名字的日志里
思路:每5分钟检测一次,那肯定需要有一个计划任务,每5分钟去执行一次。
脚本检测的时候,就是使用find命令查找5分钟内有过更新的文件,
若是有更新,那这个命令会输出东西,否则是没有输出的。
我们可以把输出结果的行数作为比较对象,看看它是否大于0。
#!/bin/bash
d=`date +%Y%m%d%H%M`
basedir=/data/web/attachment
find $basedir -type f -mmin 5 > /tmp/newf.txt
if [ -s /tmp/newf.txt ]; then
mv /tmp/newf.txt /tmp/$d.txt
fi总结:
- find的 -mmin 选项以分钟为时间查找
- [ -s filename ] 表示当文件存在,并且文件内容不为空时,条件成立
Day10 监控站点
题目:
写一个监控脚本,监控某站点访问是否正常。
提示:
- 可以将访问的站点以参数的形式提供,例如sh xxx.sh www.aminglinux.com
- 状态码吗为2xx或者3xx表示正常
- 正常时echo正常,不正常时echo不正常
#!/bin/bash
# check whether the host has curl conmmand
if ! which curl &> /dev/null
then
echo "need install curl now"
apt install curl -y
if [ $? -ne 0 ]; then
echo "install fail"
exit 1
fi
fi
# get status code
code=`curl --connect-timeout 3 -I $1 2>/dev/null | grep 'HTTP' | awk '{print $2}'`
# if code is 2xx or 3xx, condition pass
if echo $code | grep -qE '^2[0-9][0-9]|^3[0-9][0-9]'
then
echo "$1 connect success"
else
echo "$1 connect fail"
fiDay19 巡检系统服务
脚本需求:
编写一个巡检脚本,用来检测系统里面所有服务是否都正常运行。
假定,系统运行的服务有Nginx、MySQL、Redis、Tomcat
要求脚本有内容输出,可以明确告知服务是否正常运行。
提示:
1)如果服务进程存在并且端口监听说明服务正常。
2)Nginx:端口443
3)MySQL端口3306
4)Redis端口6379
5)Tomcat端口8825
6)进程是否存在使用ps aux |grep ‘xxx’
7)端口是否存在使用ss -lnp |grep ‘xxxx’
<em>#!/bin/bash</em>
check_tools()
{
<em>if</em> ! which pgrep &> /dev/null
<em>then</em>
echo "need install pgrep now"
apt install pgrep -y
<em>if</em> [ $? -ne 0 ]; <em>then</em>
echo "install pgrep fail"
exit 1
<em>fi</em>
<em>fi</em>
<em>if</em> ! which ss &> /dev/null
<em>then</em>
echo "need install ss now"
apt install ss -y
<em>if</em> [ $? -ne 0 ]; <em>then</em>
echo "install ss fail"
exit 1
<em>fi</em>
<em>fi</em>
}
check_ps()
{
<em>if</em> pgrep "<em>$1</em>" &> /dev/null
<em>then</em>
<em>return</em> 0
<em>else</em>
<em>return</em> 1
<em>fi</em>
}
check_port()
{
port_n=`ss -lnp | grep ":<em>$1</em> " | wc -l`
<em>if</em> [ $port_n -ne 0 ]
<em>then</em>
<em>return</em> 0
<em>else</em>
<em>return</em> 1
<em>fi</em>
}
check_srv()
{
<em>if</em> check_ps <em>$1</em> && check_port <em>$1then</em>
echo "<em>$1</em> is running"
<em>else</em>
echo "<em>$1</em> is not running"
<em>fi</em>
}
check_tools
check_srv nginx 443
check_srv mysql 3306
check_srv redis 6379
check_srv java 8825总结:
- 巧用函数,减少代码冗余







