第4次作业

总结脚本高级命令trap, install, mktemp, expect, 进程优先级命令:nice, renice, 进程管理工具: ps, pstree, prtstat, pgrep, pidof, uptime,mpstat,top,htop, free, pmap, vmstat, iostat, iotop, iftop, nload, nethogs, iptraf-ng, dstat, glances, cockpit, kill, job, 任务相关的命令: at, crontab, 命令,选项,示例

1. shell高级命令

trap:用于在脚本执行期间捕获和处理信号,信号可以是由操作系统其他进程发送的中断、终止或者其他的事件,可以使用trap捕获信号并在退出脚本之前执行一些清理

install:可用于安装软件包或者脚本、复制文件并在一个步骤中设置权限,如果目录不存在的话该命令也可以创建目录

-m MODE,默认755 -o OWNER -g GROUP -d DIRNAME 目录

示例:将file.txt文件复制到’/data中‘,并更改其权限; install -m 644 file.txt /data

mktemp:用于创建具有唯一名称的临时文件或者目录,在需要创建临时使用并在脚本完成运行时应删除的文件或目录时,该命令很有用,mktemp可以用于通过设置适当的权限来创建安全的临时文件或者目录

创建临时文件夹:mktemp -d #创建临时目录

-p DIR或--tmpdir=DIR #指明临时文件所存放目录位置

expect:主要用于自动执行交互式应用程序,允许在编写时与需要用户输入的应用程序的交互脚本,例如,可以使用expect通过在脚本中提供用户名和密码来自动执行ssh登录过程;适用于需要对多台服务器执行相同的操作环境中,可以提高工作效率

expect脚本通常包含五个阶段:spawn、expect、send、interact和exit。其中:

spwan:启动需要交互的程序或命令;
expect:等待特定的输出结果(字符串或正则表达式);
send:向终端发送命令或数据;
interact:进入交互模式,允许用户手动输入命令;
exit:退出脚本。
例如,下面是一个简单的expect脚本,用于登录远程服务器:

登录后复制 
#!/usr/bin/expect

set timeout 20
set user username
set password "yourpassword"
set server "192.168.1.101"

spawn ssh $user@$server
expect {
    "(yes/no)?" {
        send "yes\r"
        exp_continue
    }
    "password:" {
        send "$password\r"
    }
}
interact

2、进程优先级命令

nice

nice:可以设置进程的优先级,可用于增加或者降低进程的优先级来影响在系统中的执行顺序,较低的优先级值表示更高的优先级

常见用法和使用示例:
用法:“nice [OPTION] [COMMAND [ARG]]”
OPENTION选项:
        -n  :指定进程的优先级级别,范围在 (-20--19)之间,-20为最高优先级,19为最低优先级;系统默认优先级为10.
        -p:指定要调整优先级的进程ID;
        -h:显示帮助用法信息
COMMAND选项:要执行的命令;
ARG:为命令的参数
[root@centos8 ~]#nice -n -10 ping 127.0.0.1
[root@centos8 ~]#ps axo pid,cmd,nice | grep ping     //查看进程命令是否成功执行
   1624 ping 127.0.0.1              -10
   1659 grep --color=auto ping        0

renice
renice:可以对正在执行中的进程调整优先级,可以增加或者降低进程的优先级

使用进程ID调整优先级

示例:renice -n 10 -p 1234

3、进程管理工具

prtstat+进程:可以查看进程中的详细信息,包括进程名、编号、状态,优先级和占用信息等信息

ps、pstree:可以用于查看和管理系统重的进程信息

ps

常用选项: 'aux' :显示进程的详细信息,包括其他用户的进程 'ef' :以进程树的形式显示进程信息。 'u':显示与进程相关的用户或者所有者的详细信息;

pstree

常见选项: -p :显示进程的ID -a:显示进程的命令参数 -u:显示的所有者 -l:以长格式显示进程信息。

pidstat

pidstat 是 Linux 系统中的一个性能监控工具,用于监视进程的资源使用情况,包括 CPU、内存、磁盘 I/O 等指标。它可以帮助您监控进程的性能和瓶颈,并进行故障排查。

使用 pidstat 命令可以监视某个或某些进程的资源使用情况。常用的选项如下:

-p:指定要监视的进程 ID。
-u:显示 CPU 利用率和上下文切换次数等信息。
-r:显示内存使用情况。
-d:显示磁盘 I/O 使用情况。
-t:显示任务信息,包括进程名称、进程 ID 等。
例如,以下命令可以每1秒钟显示进程 ID 为 1234 的进程的 CPU、内存和磁盘 I/O 使用情况:

pidstat -p 1234 -u -r -d 1

pidof 是Linux系统中用来查找正在运行进程的进程号(pid)的工具,功能类似pgrep和ps。

uptime 用于显示系统总共运行了多长时间和系统的平均负载。

mpstat 是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标。

top 命令用于实时显示 process 的动态。

htop 基于NCourses的Linux进程查看器。它类似于top,但允许您垂直和水平滚动,因此您可以看到系统上运行的所有进程,以及它们的完整命令行,还可以将它们视为进程树,选择多个进程并同时对它们执行操作。

free 用于显示内存状态。

pmap 命令主要用于显示指定进程的内存映像(或称地址空间)。其中,pids是一个或一组进程的PID。

vmstat 最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

iostat 主要用于监控系统设备的IO负载情况,iostat提供了丰富的参数给我们查询各种维度的io数据, iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。

iotop 免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。

iftop 可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等,详细的将会在后面的使用参数中说明。

nload 用于实时监控linux下网络流量信息,是命令行工具,用来监控网络的吞吐量。它使用两个图表数据来对进出站流量进行可视化。

nethogs 是一个类似于Linux的top命令的开源的命令行工具,用来按进程或程序实时统计网络带宽使用率,它可以直观的显示每个进程占用的带宽。

iptraf-ng 是用于Linux的基于控制台的网络监视程序,该程序显示有关IP流量的信息,下面为大家详细讲解一下IPTraf-ng的使用方法。

dstat 可以监测CPU、磁盘、网络流量、IO、内存等,是一个全能的系统信息统计工具。

glances 是一个跨平台的监视工具,旨在通过curses或基于Web的界面提供大量监视信息,下面为大家详细讲解一下 Linux下使用Glances具体方法。

cockpit 是CentOS 8内置的一款基于Web的可视化管理工具,对一些常见的命令行管理操作都有界面支持,比如用户管理、防火墙管理、服务器资源监控等,使用非常方便,号称人人可用的Linux管理工具。

kill 命令用于删除执行中的程序或工作。

jobs 在用管理员执行一个命令后,用Ctrl+Z把命令转移到了后台。导致无法退出root的。

at 是个可以处理仅执行一次就结束调度的指令,不过要执行 at 时, 必须要有 atd 这 个服务 (第十七章) 的支持才行。

crontab 这个指令所设置的工作将会循环的一直进行下去! 可循环的时间为分 钟、小时、每周、每月或每年等。

总结索引数组和关联数组,字符串处理,高级变量使用及示例。

1、索引数组使用整数作为索引来访问和操作数组元素,编号是从0开始递增,属于数值索引;

#遍历数组

for i in "${student[@]}";do

echo $i

done

2、关联数组是一种根据键名(字符串)访问元素的数组类型。定义关联数组时需要使用声明 -A。可以使用键名访问数组元素的值。

字符串处理
Bash中有很多内置的字符串处理工具和技巧,可以对字符串进行各种操作。以下是一些 Bash 中常用的字符串处理函数和示例:

${#string} 可以获得字符串的长度:
my_string="hello, world"
echo ${#my_string}   # 输出 12

${string:start:length} 可以截取子字符串,其中 start 是子字符串开始的位置, length 是子字符串的长度:
my_string="hello, world"
echo ${my_string:0:5}   # 输出 "hello"
echo ${my_string:7:5}   # 输出 "world"

${string#substring} 可以从字符串的开头删除指定的子字符串,其中 substring 是要删除的子字符串:
my_string="hello, world"
echo ${my_string#hello, }   # 输出 "world"

${string%substring} 可以从字符串的末尾删除指定的子字符串,其中 substring 是要删除的子字符串:
my_string="hello, world"
echo ${my_string%world}   # 输出 "hello, "

${string/find/replace} 可以将字符串中的所有指定子字符串 find 替换为 replace:
my_string="hello, world"
echo ${my_string/world/there}   # 输出 "hello, there"

${string//find/replace} 可以将字符串中的所有指定子字符串 find 替换为 replace,并且不止替换一次:
登录后复制 
my_string="hello, world"
echo ${my_string//l/L}   # 输出 "heLLo, worLd"

高级变量使用通常是在shell脚本中使用特殊的变量来处理字符串,可以用于修改参数、替换命令等

# 参数扩展
filename="example.txt"
echo ${filename%.txt}  # 输出: example

# 命令替换
date=$(date +%Y-%m-%d)
echo "Today is $date"

# 算术扩展
count=5
echo $((count + 2))  # 输出: 7

求10个随机数的最大值与最小值

 使用递归调用,完成阶乘算法实现

解析进程和线程的区别?

进程和线程都是计算机中实现并发的方式,但它们有不同的特点和作用。

进程是操作系统分配资源的基本单位,每个进程都拥有独立的内存空间、代码和数据,进程之间不能直接共享数据。每个进程都有自己的地址空间、堆栈、文件描述符等信息,并且进程之间通过进程间通信(IPC)的方式来进行数据传输。进程的创建、切换和销毁会消耗一定的系统资源,因此进程通常是比较重量级的。

线程是进程中执行任务的最小单位,是进程内部的一个执行路径。线程与进程共享同一份数据和代码段,每个线程都有自己的堆栈和程序计数器,但是所有线程共享进程的虚拟地址空间和物理资源,线程之间可以直接访问同一片内存区域,因此线程之间的通信和数据交换比进程之间更加轻便快捷。线程的创建、切换和销毁所需的系统资源比进程要少得多,因此线程通常是比较轻量级的。

总的来说,进程和线程都是实现并发的方式,但是它们的作用和特点不同。进程是基本的资源分配单位,而线程则是程序执行的最小单位,线程可以更高效地实现并发操作和多任务处理。

 解析进程的结构

进程是计算机中最基本的资源分配单位,它由操作系统负责创建、管理和调度,进程可以看做是一个程序的执行实例。

进程的结构主要包括以下几个部分:

程序段(Code Segment):也称为文本段,是存放程序指令的内存区域,通常是只读的。程序段是进程运行期间不变的部分,它包含了所有可执行指令,程序段在进程创建时就已经确定好了。
数据段(Data Segment):数据段存储的是程序中已经初始化的全局变量、静态变量和常量等数据,数据段通常是可读写的。
堆栈段(堆栈段存储着程序执行过程中产生的临时数据和函数调用的返回地址等信息,堆栈段是一个后进先出的数据结构,它的大小可以动态扩展,通常是可读写的。Stack Segment):
堆区(Heap):堆区是程序执行期间动态申请和释放内存所使用的区域,堆区是可读写的,其大小可以动态调整。
进程控制块(Process Control Block,PCB):进程控制块是系统管理进程的数据结构,它包括了进程的基本信息,如进程状态、进程标识符、进程优先级、程序计数器、寄存器等,同时还记录了进程的资源使用情况,如打开的文件、分配的内存等。
 

解析磁盘中的代码如何在计算机上运行的?

磁盘中的代码需要被加载到内存中才能在计算机上运行。以下是代码从磁盘中加载到内存并运行的主要步骤:

1、磁盘的文件系统会根据程序文件的路径找到该文件,并将其读入内存。读取的过程通常会将磁盘上的代码按照固定大小的块(或扇区)读入内存,直到文件被完全读入。

2、操作系统负责管理内存,在代码被读入内存后,操作系统会创建一个新进程来运行这段代码。进程的空间被划分成多个段,其中包括代码段、数据段和堆栈段等。代码段用于存储可执行指令,数据段用于存储全局变量和静态变量等数据,堆栈段用于存储局部变量和函数调用的返回地址等信息。

3、操作系统通过程序计数器(Program Counter)记录代码段中当前正在执行的指令地址,指令地址从代码段中获取。

4、当操作系统把控制权交给进程时,CPU会从代码段中读取指令,并按照指令逐条执行。执行完一条指令后,操作系统会更新程序计数器,指向下一条指令的地址,使得CPU能够继续执行下一条指令。

5、在运行期间,程序可能会调用系统函数或者发生中断等事件,这些事件会导致CPU跳转到操作系统内核态执行相应的处理。当操作系统处理完相应的事件后,它会把控制权交还给用户态运行的程序,程序继续执行从而完成相应的任务。

6、当程序运行结束时,操作系统释放该进程所使用的内存,并回收资源。

总之,磁盘中的代码需要被加载到内存中,并创建一个新的进程来运行,通过程序计数器实现指令的逐条执行,同时与操作系统进行交互,最终完成相应的任务并释放内存。

总结OOM原理,及处理方法

OOM(Out-Of-Memory)是指操作系统中的内存耗尽问题。当系统无法满足当前进程所需的内存时,就会发生OOM事件。在Linux中,OOM事件通常会导致进程被终止。对于系统管理员来说,必须了解OOM事件的原理,并采取措施来避免或处理OOM事件。

Linux中的OOM事件是由两个因素引起的:内存过度使用和内存压力。内存过度使用是指某个进程占用了过多的内存,导致系统中可用内存不足;而内存压力是指系统整体内存不足,甚至可能导致系统崩溃。

为了避免OOM事件的发生,可以采取以下几种方法:

增加系统内存:这是最简单的方法,可以增加系统的内存容量以避免OOM事件的发生。
使用内存限制:可以使用系统资源管理器或操作系统内置的工具来限制进程的内存使用,从而确保系统的内存不会被耗尽。
调整虚拟内存交换设置:在Linux中,可以使用虚拟内存交换机制来管理内存。通过调整虚拟内存的设置,可以避免OOM事件的发生。例如,可以将虚拟内存交换设置到硬盘上,以扩展系统内存。
使用内存压缩:内存压缩是一种技术,可以将内存内容压缩并存储在物理内存中,从而节省物理内存的使用量。在Linux中,可以使用内存压缩技术来避免OOM事件的发生。

当OOM事件不可避免时,可以采取以下几种处理方法:

调整进程优先级:可以通过调整进程的优先级,使其减少对系统资源的占用,从而避免OOM事件的发生。
杀死进程:对于OOM事件,可以手动杀死占用内存过多的进程,以释放系统资源。
重启系统:如果OOM事件导致系统无法继续正常运行,可以考虑重新启动系统。
 

结合进程管理命令,说明进程各种状态

通过进程管理命令,你可以观察和管理运行在操作系统中的各个进程。这些命令可以提供关于进程的状态信息,包括进程的运行状态、优先级、PID(进程标识符)、父进程ID、内存使用等。以下是一些常见的进程状态:

运行状态(Running):进程当前正在执行或等待CPU分配时间片。在进程管理命令中,通常以 "R" 或 "S" 表示。

就绪状态(Runnable):进程已经准备好运行,但尚未获得CPU时间片分配。通常表示进程在等待系统调度执行。在进程管理命令中,通常以 "R" 或 "S" 表示。

等待状态(Waiting):进程正在等待某个事件发生,如等待IO操作完成、等待某个信号、等待资源可用等。在进程管理命令中,通常以 "D" 表示。

停止状态(Stopped):进程暂停执行,等待外部条件触发后恢复执行。进程可以通过信号被停止,如Ctrl+Z发送的SIGTSTP信号。在进程管理命令中,通常以 "T" 表示。

僵尸状态(Zombie):进程已经终止,但其进程描述符仍然存在,等待父进程回收其资源。僵尸进程通常是由于父进程没有正确处理子进程终止信号造成的。在进程管理命令中,通常以 "Z" 表示。

除了以上常见的状态,还有一些其他的状态,如睡眠状态(Sleeping)和僵尸子进程(Defunct)。具体的进程状态可以根据不同的操作系统和命令输出而有所不同。

一些常用的进程管理命令包括:

ps:显示系统中的进程状态信息。
top:实时显示系统中的进程列表和系统状态。
htop:一个交互式的进程查看器,显示系统中的进程和资源使用情况。
kill:发送信号给指定进程,可以用来终止、暂停或恢复进程。
nice:修改进程的优先级.
renice:修改已运行进程的优先级。

说明IPC通信和RPC通信实现的方式

IPC通信实现的方式较为多样化,其中最常见的方式包括:

1.管道(Pipe):管道是一种半双工的通信方式,通常用于父子进程之间的通信。管道只支持单向数据传输,它的基本思想是用一个缓冲区作为共享区域来实现父子进程之间的数据交换。

2.消息队列(Message Queue):消息队列是一种消息传递机制,通常用于同一主机内的进程间通信。消息队列提供了一种异步的通信方式,发送方发送消息后即可立即返回,而接收方则可以在需要时从消息队列中取出消息。

3.信号量(Semaphore):信号量是一种用于进程间同步的机制。信号量的作用是保护一段代码,在同一时刻只允许一个进程执行。当一个进程想要执行这段被信号量保护起来的代码时,需要先获取信号量,执行完代码后再释放信号量,以便其他进程能够获取信号量并继续执行。

4.共享内存(Shared Memory):共享内存是一种高效的进程间通信方式。它将一段内存映射到多个进程的地址空间中,多个进程可以直接访问这段共享内存,从而实现数据共享。

RPC通信则通过网络实现跨主机进程之间的通信,其实现方式通常包括:

1.客户端-服务器(Client-Server)模式:在此模式下,客户端应用程序向服务器应用程序发送请求,并等待响应。服务器应用程序接收请求,执行相应的操作,并将结果返回给客户端。

2.远程对象调用(Remote Object Invocation):在此模式下,客户端使用远程对象代理来调用远程对象。远程对象代理掌握着远程对象的网络地址信息,并将请求序列化为网络字节流进行传输,然后等待远程对象返回结果。

3.Web服务(Web Service):Web服务是一种基于HTTP协议实现的RPC机制。客户端通过HTTP请求访问Web服务,Web服务接收请求并调用相应的处理函数,最终将处理结果封装为XML或JSON格式返回给客户端。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值