Linux学习日志(十一)

时间:2021-02-05 06:55:52

进程管理

 二进制的格式为ELF,是CPU指令集中的指令
程序=指令+数据,

mmap 共享内存
通过fork()进程生成

init是所有进程的父进程

 task_struct任务结构:是一种数据结构
双向循环链表

top:

      M:按内存占用百分比大小排序
P:按cpu占用百分比大小排序,默认
T:按累计占有时长进行排序
1:分开显示
l: 是否显示负载信息
t:是否显示cpu和进程的统计信息
m:是否显示内存和交互分区的信息
q:退出
k:kill,杀掉进程
s:改变top刷新频率
常用选项:
-d #:指定刷新时间间隔
-b:以批次显示top的刷新
-n # 指定指定的次数

htop

u:选择指定用户的进程
l: 显示进程所打开的文件列表
s:显示进程执行的系统调用
a:显示进程的进程的cpu上
#:快速将光标定位之指定的PID进程上
quit

vmstat

 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 341004 27500 312528 0 0 110 10 60 100 1 1 98 0 0

procs

r:运行或等待cpu时间片的进程的个数
b:被阻塞(通常为等待I/O完成)的进程的长度

memory

swpd:从物理内存交互至swap中的数据量
free:未使用的内存大小
buffer:buffer空间大小,通常与缓存写操作相关
cache:cache空间大小,通常与缓存读操作相关

swap

si:swap in 数据进入swap中的数据量,通常是速率。kb/s
so:swap out 数据离开swap中的数据量,通常是速率。kb/s

io:

bi:block in:从块设备读入的数据量,通常是速率,kb/s
bo:block out:保存至块设备中的数据量,通常是速率,kb/s

SYSTEM

in:中断发生频率。每秒的中断数
cs:context switch 上下文切换,进程切换,通常是速率,kb/s

cpu:

us:用户空间的使用率
sy:内核空间的使用率
id:空闲
wa:等待的
st:被偷走的

使用格式

   vmstat [delay [counts]]
-s:显示内存统计数据

ps:显示进程状态的命令

进程:

   与终端相关的进程:a
与终端无关的进程:x
u:以用户为中心显示进程相关信息

u:

            %CPU: cputime/realtime
$MEM:
VSZ:虚拟内存集,Virutal menmory Size
RSS:常驻内存集,
STIME:启动时间
TIME:累计占用的内存时间 []表示内核线程

STAT

   R:运行或可运行态
S:可终端
D:不可终端
T:停止
Z:僵死
s:session leader 有子进程
+:前台进程
l:多线程进程
N:低优先级进程
<: 高优先级进程

常用组合一:ps aux
常用组合之二:ps -ef

 -e:显示所有进程
-f:以进程的长格式显示

常用组合之三:ps -eFH

      -F:显示额外信息
-H:显示进程的层次信息

自定义要显示的信息:-o

       ps  auo pid command
rtprio:实时优先级
ni:nice值
pri:优先级
psr:运行的cpu

pstree:显示进程树

Pgrep pattern

   列如:   pgrep bash 
选项:
-U UserName :显示相关用户的进程
-G GROUPNAME:相关组的进程

pgroup:

   -U Username:仅显示指定用户的进程的进程的PID
-G Groupname:仅显示指定用户组的进程的进程的PID

pidof:显示指定命令所启动的pid

pidof command

进程Nice

用来手动调整进程优先级
-20,19
100,139

默认nice为0.其默认优先级为120

nice:普通用户只能调大此值

对于尚未启动的程序
nice -n # COMMAND 表示进程以#进程启动

对于运行中的进程:
renice # PID 调整PID的nice值

查看 ps axo ni command pid

进程间通信(IPC):
信号:

  kill命令:可以实现向其他进程发送信息

kill -l :可以查看向进程发送的所有信息
man 7 sigual

kill -SIGNAL PID
-SIGNAL:
数字代号:比如1,9等
信号名称:如SIGHUP等
简写的信号名称:如HUP等

1) SIGHUP:让程序重读配置文件,而不用重启程序
2) SIGINT:中断信号。Ctrl+c即发送次信号
9) SIGKILL:杀死进程
15) SIGTERM:终止进程,比较优雅(默认)

Linux的作业控制

前台作业:占据着一个终端
后台作业:作业执行时不占据终端,作业启动后就释放终端

非守护进程类的程序,启动以后都在前台工作

      如果已经启动:前台-->后台。ctrl+z把前台作业送往后台,作业被”停止“
如果尚未启动:COMMAND &

退出当前会话,作业也会终止,因为作业与当前终端相关,如果把作业送往后台后,不期望作业随终止结束而停止

nohup COMMAND &

如何让送往后台的作业继续执行:

    fg  [[%]作业号码]:将作业调回前台继续进行
bg [[%]作业号码]:让作业在后台继续进行
#默认的为最后一个进入后台的任务
kill %作业号码:终止作业

bash脚本编程

case语句

条件测试:

   0:成功
1-255:失败

case语句语法格式:

     case 表达式 in 
模式1)
条件1
;;
模式2)
条件2
;;
模式n)
条件n
;;
*)
剩余条件
;;
esac

case中各模式可以使用模式:

  a|b:a或者b
*:匹配任意长度的任意字符
?:匹配任意单个字符
[-]:范围匹配

bash脚本编程之函数:

  函数是能够实现模块化编程的工具

函数:function,功能组件

可被调用:函数有函数名
函数出现的地方:而自动被替换成函数定义的代码

函数定义:

语法:
FuncName(){
函数体
}
function FuncName{
函数体
}

函数有两种返回值:

       正常返回的数值:
函数中的打印语句,如echo或print
最后一句执行成功
执行状态的烦返回值:
取决于函数中执行的最后一条语句
自定义: return N

函数可以接受参数:

   在函数体可以使用类似脚本调用位置参数一样的参数
$1,$2.....
$0
$?
$*,

函数:调用 直接写

如何在函数中使用变量:变量作用域

在函数中使用了在主程序中声明的变量:重新赋值会影响主程序中的变量
如果不期望函数与主程序中的变量冲突,函数中使用变量都用local装饰;即使用局部变量
在函数中使用了序中在主程没有声明的变量:在函数执行结束后即被撤销,无论是否使用local装饰符

问题一:如果想把脚本的全部位置参数,统统传递给脚本中函数使用,怎么办?

    使用$*传递

练习

练习:写一个脚本
1.提示用户输入一个nice值
2.显示指定nice指定进程名及pid
3.提示用户选择要修改器nice至的进程的pid和nice值
4,执行修改
5。别退出,继续修改

#!/bin/bash
if [[ $UID -eq 0 ]];then
echo "keyi suibian tiao nice !"
else
echo "zhineng tiaoda nice !"
fi
while true;do
read -p "Enter a nice : " nicename
/bin/ps axo nice,user,command,pid| grep "^[[:space:]]${nicename}\>"
read -p "Enter a nice : " niceid
read -p "Ener a PID : " pidid
/usr/bin/renice $niceid $pidid
done

练习:写一个脚本,判定172.16.0.0网络内有哪些主机在线,在线的用绿色显示,不在线的用红色显示;要求,编程中使用函数;

练习:写一个脚本,完成如下功能(使用函数):
1、提示用户输入一个可执行命令;
2、获取这个命令所依赖的所有库文件(使用ldd命令);
3、复制命令至/mnt/sysroot/对应的目录中
解释:假设,如果复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,如果复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;
4、复制各库文件至/mnt/sysroot/对应的目录中,其要求命令;

练习:写一个脚本,完成如下功能(使用函数):
1、脚本使用格式:

2、如果文件事先不存在,则创建;且前几行内容如下所示:

3、如果事先存在,但不空,且第一行不是“#!/bin/bash”,则提示错误并退出;如果第一行是“#!/bin/bash”,则使用vim打开脚本;把光标直接定位至最后一行
4、打开脚本后关闭时判断脚本是否有语法错误
如果有,提示输入y继续编辑,输入n放弃并退出;
如果没有,则给此文件以执行权限;