LiangGaRy-学习笔记-Day15

这篇具有很好参考价值的文章主要介绍了LiangGaRy-学习笔记-Day15。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、编写脚本

1.1、拓展:shell脚本语法

case语句:

  • 主要用于做选择的;
  • 多条件、多分支结构;

case语句注意事项

  • case行尾必须以单词“in”,每一模式必须以单个右括号")"结束
  • 双分号";;"表示命令序列的结束
  • 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如A|B
  • 最后的“*)”表示默认模式,其中的星相当于通配符
#格式说明
case in 
模式1)
	命令1
	;;
模式2)
	命令2
	;;
.......
*)
	命令n
	;;
esac
1.2、编写一个case语句脚本

编写一个shell脚本

  • 让用户选择;并且输出对应的选择
[root@Node1 sh]# vim case_v1.sh
#!/bin/bash
#Author By LiangGaRy
#Time:2023年5月24日
#############################
read -p  "请输入你喜欢的数字【1-4】:" num
echo "你选择的号码是:$num"
case $num in
1)
        echo “这个是特等奖1”
;;
2)
        echo "这个是一等奖2"
;;
3)
        echo "这个是二等奖3"
;;
4)
        echo "这个是三等奖4"
;;
*)
        echo "请输入【1-4】的数字~!"
;;
esac

#测试脚本:
[root@Node1 sh]# bash case_v1.sh 
请输入你喜欢的数字【1-4】:1
你选择的号码是:1
“这个是特等奖1”
1.3、编写统计Linux进程脚本
[root@Node1 sh]# vim tj.sh
#!/bin/bash
#Author By LiangGaRy
#Time: 2023年5月24日
##########################
#定义四个状态值的初始值为0
running=0
sleepping=0
stopped=0
zombie=0
procs=0
#或者是自己统计/proc以数字开头的进程
#ls /proc/ | grep ^[0-9]

        #定义一个进程值,用于统计所有的进程,这里相当于让他循环一次就+1
        procs=$[procs+1]
        #这里就是截取进程的状态值S T Z 等等的状态
        stat=$(awk '{print $3}' $pid/stat)
        #再使用一个case循环
        case $stat in
        R)
                running=$[running+1]
        ;;
        S)
                sleepping=$[sleepping+1]
        ;;
        T)
                stopped=$[stopped+1]
        ;;
        Z)
                zombie=$[zombie+1]
        ;;
        esac
done
echo -e "进程信息统计如下:\n 进程总数为:$procs \n 运行中进程数为:$running \n 
休眠进程数为:$sleepping \n stopped 进程数为:$stopped \n zombie 进程数为:$zomb
ie \n"

#测试脚本
[root@Node1 sh]# bash tj.sh 
进程信息统计如下:
 进程总数为:103 
 运行中进程数为:0 
 休眠进程数为:103 
 stopped 进程数为:0 
 zombie 进程数为:0 

2、文件描述符

2.1、文件描述符定义

百度百科的定义:

  • 内核(kernel)利⽤⽂件描述符(file descriptor)来访问⽂件。
  • ⽂件描述符是⾮负整数。打开现存⽂件或新建⽂件时,内核会返回⼀个⽂件描述符。
  • 读写⽂件也需要使⽤⽂件描述符来指定待读写的⽂件。

理解:

  • 文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。

通俗理解:

  • 进程运⾏的时候是打开了很多的⽂件,
  • 为了区分打开的⽂件,linux给每个⽂件分配编号,标号就是⼀个⾮零整数,
  • 这个⾮零的整数 就是⽂件描述符

PCB控制块:

  • 一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,
  • PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。
  • 进程级的描述符表的每一条记录了单个进程所使用的文件描述符的相关信息,
  • 进程之间相互独立,一个进程使用了文件描述符3,另一个进程也可以用3;

文件描述符表:

  • 当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)
  • 打开文件时的标识(open()的flags参数)
  • 文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)
  • 与信号驱动相关的设置
  • 对该文件i-node对象的引用,即i-node 表指针

i-node表:

  • 文件类型(例如:常规文件、套接字或FIFO)和访问权限
  • 一个指针,指向该文件所持有的锁列表
  • 文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳
    • 文件的类型
    • 文件的字节数
    • 文件的USERID
    • 文件的GID
    • 文件读写权限
    • 文件的时间戳
    • 文件的链接数
    • 文件数据的block位置

案例:关于修改文件描述符

#获取系统打开文件描述符的数量
[root@Node1 sh]# cat /proc/sys/fs/file-nr 
992	0	197381
992:表示已经分配的FD的数量
0:表示已经分配但是没有使用的数量
197381:表示系统可用最大的FD的数量

已⽤FD数量=为已分配的FD数量 - 为已分配但尚未使⽤的FD数量 ,系统层⾯

#获取进程打开的文件描述符的数量
	#先使用vim 修改一个文件
[root@Node1 sh]# vim jincheng.sh 
	#然后打开一个终端-->查看vim进程的pid
[root@Node1 ~]# pidof vim
6786
	#然后去到/proc/目录下找出
[root@Node1 ~]# ll /proc/6786/fd/
total 0
lrwx------ 1 root root 64 Jun 23 22:44 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 23 22:44 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 23 22:44 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 23 22:44 4 -> /sh/.jincheng.sh.swp
	#3-->存在的,不停的闪烁,红底白字,等待输入
#更改文件描述符限制:
	#明显的报错信息:“too many open files” 错误,提示你需要添加文件描述符限制数量
	#查看文件描述符限制数量
[root@Node1 ~]# ulimit -n
1024
	#一次性修改文件描述符
[root@Node1 ~]# ulimit -n 10240
[root@Node1 ~]# ulimit -n
10240
	#如果想要永久修改,需要修改配置文件
[root@Node1 ~]# vim /etc/security/limits.conf 
 59 #@student        -       maxlogins       4
 60 liangjiawei     hard    nofile  10240
	#用户名		硬件数		类型	文件描述符
	#切换用户访问
[root@Node1 ~]# su - liangjiawei
Last login: Thu Jun 22 14:16:15 CST 2023 on pts/1
[liangjiawei@Node1 ~]$ ulimit -n
10240

#直接修改对整个操作系统可以使用DF的数量,改为51200
[root@Node1 ~]# echo "51200" > /proc/sys/fs/file-max 
[root@Node1 ~]# cat /proc/sys/fs/file-nr 
992	0	51200
[root@Node1 ~]# echo "fs.file-max=51200" >> /etc/sysctl.conf 

案例:获取文件的打开数

#获取系统的打开文件数量
[root@Node1 ~]# lsof  | wc -l
2412

#获取某个用户打开文件数量
[root@Node1 ~]# lsof -u liangjiawei | wc -l
15

#获取某个服务打开文件数量
[root@Node1 ~]# pidof httpd
6806 6805 6804 6803 6802 6779
[root@Node1 ~]# lsof -p 6806 | wc -l
123

拓展:

  • 文件描述符缺点:不能够一直unix以外系统
2.2、重定向

输出重定向:

  • 讲文件的正常输出结果保存到指定的文件中,不显示在屏幕
  • 使用的符号:
    • “>”:覆盖文件
    • “>>”:追加内容
#正常命令echo会输出到屏幕
[root@Node1 ~]# echo " this is a boy"
 this is a boy

#如果使用输出重定向-->则改变输出路径-->如果没有aa.txt会自动创建
[root@Node1 ~]# echo " this is a boy" > aa.txt
[root@Node1 ~]# cat aa.txt 
 this is a boy

输入重定向:

  • 将米宁接收输入的路径有默认的键盘改为其他文件,而不是等待从键盘输入
  • 操作符号:“<”–>
  • 输入重定向可以理解为通过文件中的内容作为输入的数据
#给用户赋予密码
[root@Node1 ~]# echo 123456 > passwd.txt
[root@Node1 ~]# cat passwd.txt 
123456
[root@Node1 ~]# passwd --stdin zhangsan < passwd.txt 
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.

错误重定向

  • 将命令执⾏过程中出现的错误信息保存到指定⽂件当中,不直接显示在显示器上
  • 操作符号:“2>”–>
#如果命令错误会输出到屏幕
[root@Node1 ~]# ls llll 
ls: cannot access llll: No such file or directory

#如果错误重定向添加则会改变
[root@Node1 ~]# ls llll 2> /dev/null
[root@Node1 ~]# 

#把正确的执行放在一个文件,把错误的又放到另外一个文件
[root@Node1 ~]# ll sdfjdlsk 1> right.txt 2> error.txt
[root@Node1 ~]# cat right.txt 
[root@Node1 ~]# cat error.txt 
ls: cannot access sdfjdlsk: No such file or directory

混合使用:

  • 不管是正确与否都全部放到一个文件;
  • 操作符号:
    • “&>”
    • “>” /dev/null 2>&1
    • “1>& 2”
#不管是好的还是坏的都放到同一个文件里边
[root@Node1 ~]# ll sdfjdlsk &>  error.txt
[root@Node1 ~]# cat error.txt 
ls: cannot access sdfjdlsk: No such file or directory

案例说明

#追加重定向
[root@Node1 ~]# cat /proc/cpuinfo  > aa.txt 
[root@Node1 ~]# uname -a  >> aa.txt 
[root@Node1 ~]# tail -3 aa.txt 
power management:
Linux Node1 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

#清空文件内容
[root@Node1 ~]# > aa.txt 
[root@Node1 ~]# cat aa.txt 

#输入重定向
[root@Node1 ~]# cat aa.txt 
[root@Node1 ~]# grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
	#统计passwd文件行数
[root@Node1 ~]# wc -l < /etc/passwd
21

#使用EOF来结合重定向
[root@Node1 ~]# cat >a.txt << EOF
> AA
> BB
> CC
> EOF
[root@Node1 ~]# cat a.txt 
AA
BB
CC
#追加
[root@Node1 ~]# cat >> a.txt << EOF
> aa
> bb
> cc
> EOF
[root@Node1 ~]# cat a.txt 
AA
BB
CC
aa
bb
cc

#错误重定向:
[root@Node1 ~]# ls sdfjsdkl 2> aa.txt 
[root@Node1 ~]# cat aa.txt 
ls: cannot access sdfjsdkl: No such file or directory

结合重定向;–>经常会见到两个文件

  • /dev/null:所有写⼊它的内容都会永远丢失. ⽽尝试从它那⼉读取内容则什么也读不 到
  • /dev/zero:当你读它的时候,它会提供⽆限的空字符
2.2、IO 概念

标准输入与标准输出

  • 文件描述符–>0–>标准输入,默认的就是设备键盘
  • 第二个文件–>1–>标准输出,默认的就是显示器
  • 标准错误–>2–>默认显示的就是显示器

重定向:重定向输出和重定向输入;

I/O概念:

  • I/O(input/output),即输入和输出端口,操作系统每一个设备都有一个专有的I/O地址用来处理输入输出信息。
  • CPU与外部设备之间的通信连接和数据交换都需要通过I/O地址来实现。
  • Linux内核将所有外部设备都看作一个文件来操作,应用程序通过调用文件操作的系统调用来与内核进行交互,来实现设备的访问和操作。

I/O模型:

  • 阻塞I/O
  • 非阻塞I/O
  • I/O多路复用
  • 信号驱动I/O
  • 异步I/O
2.3、dd命令

作用:指定大小的块拷贝一个文件;

语法:dd if=xxx of=ooo bs=n count=N

  • if:表示输入文件
  • of:表示输出的文件
  • bs:表示字节数
  • count:复制多少次
#创建一个10M的文件
[root@Node1 ~]# dd if=/dev/zero of=bb.txt bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00423371 s, 2.5 GB/s
[root@Node1 ~]# ls -l bb.txt 
-rw-r--r-- 1 root root 10485760 Jun 24 14:24 bb.txt
[root@Node1 ~]# 
2.4、管道符“|”

作用:管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。

命令格式:

  • 命令1 | 命令2
    • 命令1的输出作为命令2的参数
[root@Node1 ~]# cat /etc/passwd | grep liangjiawei
liangjiawei:x:1000:1000:liangjiawei:/home/liangjiawei:/bin/bash

2.5、tee命令

作用:从标准输入读取,再写入标准输出和文件

语法:tee + 选项 + 文件名

选项:

  • -a:追加
  • –help:获取帮助
#把磁盘情况追加到一个文件中
[root@Node1 ~]# df -h  | tee -a disk.log
[root@Node1 ~]# cat disk.log 
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   19G  1.2G   18G   7% /
..........

3、查找相关的命令

3.1、which命令

作用:用于查找命令的绝对路径

语法:which + 选项 + 命令

#查看ls命令
[root@Node1 ~]# which ls
alias ls='ls --color=auto'
	/usr/bin/ls
3.2、whereis命令

作用:查找命令的路径以及相关信息

语法:whereis + 选项 + 命令

选项:

  • -b:只搜索二进制文件
  • -m:搜索手册文件
  • -s:搜索源文件
#查找ls命令
[root@Node1 ~]# whereis  ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
3.3、locate命令

作用:查找文件的路径

  • 这个命令是基于/var/lib/mlocate/mlocate.db库来搜索的
  • 其中/etc/updatedb.conf这个文件制定了更新时间
  • /etc/con.daily/mlocate:这里指定了更新得频率

语法:locate+ 选项 + 文件文章来源地址https://www.toymoban.com/news/detail-467250.html

#更新库
[root@Node1 ~]# updatedb
[root@Node1 ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
.........

到了这里,关于LiangGaRy-学习笔记-Day15的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!

     * 20231020 写这篇博文断断续续花了好几天,为了说明不同shell在执行同一脚本文件时的差别,我分别在csdn提供线上Linux环境 (使用的shell是zsh)和自己的电脑上(使用的shell是bash)做测试。功夫不负有心人,在其中一些实例中可以体现出zsh和bash的对脚本文件支持的差别,收

    2024年02月07日
    浏览(41)
  • Linux shell编程学习笔记44:编写一个脚本,将md5sum命令执行结果保存到变量中,进而比较两个文件内容是否相同

    在  Linux shell编程学习笔记42:md5sum https://blog.csdn.net/Purpleendurer/article/details/137125672?spm=1001.2014.3001.5501 中,我们提到编写一个在Linux系统下比较两个文件内容是否相同的脚本。 基本思路是: 其中有两个难点: 1.文件的md5值的获取 2.md5值的比较 对于第1个难点,我们的解决办法是

    2024年04月10日
    浏览(56)
  • 【运维工程师学习三】Linux中Shell脚本编写

    Shell程序有很多, 如 Korn shell(ksh)、Bourne Again shell(bash)、C shell(包括csh与tcsh) 等等, 各主要操作系统下缺省的shell: AIX下是 Korn Shell Solaris缺省的是 Bourne shell FreeBSD缺省的是 C shell HP-UX缺省的是 POSIX shell Linux缺省的是 Bourne Again shell 但这种在命令行中的命令是即时输出结果的,不

    2024年02月11日
    浏览(57)
  • Day 15 python学习笔记

    用print打印对象时,会自动调用 面向对象的三大特征:封装、继承、多态(有的人认为抽象也是) 在面向对象中,认为定义在类中的属性外界可以更改是不安全的,封装指一种安全机制,不让外界直接修改或操作属性,因此,将属性私有化(封装),不让外界访问,如果要访

    2024年02月07日
    浏览(31)
  • Linux shell编程学习笔记29:shell自带的 脚本调试 选项

    Linux shell脚本的调试方法比较多,上次我们探讨和测试了shell内建命令set所提供的一些调试选项,其实 shell 本身也提供了一些调试选项。我们以bash为例来看看。 purleEndurer @ csdn ~ $ bash --help GNU bash, version 4.2.46(2)-release-(x86_64-redhat-linux-gnu) Usage:  bash [GNU long option] [option] ...      

    2024年02月04日
    浏览(40)
  • Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

     * 20231103 增加了 五、数组拼接或合并 数组是一种常见的数据结构。跟大多数编程语言一样,大多数Linux shell脚本支持数组,但对数组的支持程度各不相同,比如数组的维度,是支持一维数组还是多维数组?再如,数组元素的下标是从 0 开始还是从1开始?则因shell而异,下面

    2024年02月06日
    浏览(49)
  • Linux shell脚本编写

    一、常用shell脚本指令 echo: 输出指定的文本或变量值到标准输出。 read: 从标准输入读取用户输入,并将其保存到指定的变量中。 if: 执行条件语句,如果满足指定条件则执行特定操作,否则执行其他操作。 for: 循环执行特定操作,每次迭代更新变量值。 while: 循环执行

    2024年02月16日
    浏览(38)
  • shell脚本简介+编写

    1、常用Linux命令 2、Linux下脚本编写 3、windows下CMD常用命令 1、系统预定义变量 常用系统变量 $HOME 、 $PWD 、 $SHELL 、 $USER 、 $PATH 等。 显示当前所有 Shell 变量: set 2、自定义变量 基本语法 定义变量:变量名=变量值 撤销变量:unset 变量名 声明静态变量:readonly变量,注意:不

    2024年02月02日
    浏览(31)
  • 简单shell脚本的编写

    shell脚本就是将命令写入文本中,文本可以被执行。 脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译) shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。 简单使用 $0 表示当前

    2024年02月10日
    浏览(29)
  • shell 脚本编写

    2023年04月09日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包