shell练习
本文最后更新于 273 天前,其中的信息可能已经有所发展或是发生改变。

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

总结:

  1. date命令用法
  2. 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

总结:

  1. && 连接符只有前面的命令执行成功了才会执行后面的命令。在本例中,只有两条命令都执行成功返回值才是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>

总结:

  1. stat相关

查看文件权限: stat -c %a 1.txt

查看文件所有者:stat -c %G 1.txt

查看文件所属组:stat -c %U 1.txt

  1. &&: 前面命令执行成功再执行后面命令
  2. ||:前面命令不成功再执行后面命令

 

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

总结:

  1. find的 -mmin 选项以分钟为时间查找
  2. [ -s filename ] 表示当文件存在,并且文件内容不为空时,条件成立

Day10 监控站点

题目:

写一个监控脚本,监控某站点访问是否正常。

提示:

  1. 可以将访问的站点以参数的形式提供,例如sh xxx.sh www.aminglinux.com
  2. 状态码吗为2xx或者3xx表示正常
  3. 正常时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"
fi

Day19 巡检系统服务

脚本需求:

编写一个巡检脚本,用来检测系统里面所有服务是否都正常运行。

假定,系统运行的服务有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

总结:

  1. 巧用函数,减少代码冗余
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇