10、进程管理,case和函数 学习笔记

ps:显示系统当前进程状态的命令

ps a 所有与终端相关的进程

ps x 所有与终端无关的进程

ps u 以用户为中心显示进程相关信息

VSZ:

虚拟内存集,Virutal menmory Size

RSS:

常驻内存集

STAT:

R:运行或可运行

S:可中断睡眠

D:不可中断睡眠

T:停止

Z:僵死

s:session leader 有子进程

+:前台进程

l:多线程进程

N:低优先级进程

<: 高优先级进程

START:

启动时间

TIME:

累计占用的内存时间

COMMAND

[]表示内核线程

ps [option]

-e 显示所有进程

-f 以进程的长格式显示

-F 显示额外信息

-H 显示进程的层次信息

-o                 自定义要显示的信息

ps axo pid,command

ps aux 常用组合

ps -ef 常用组合

ps -eFH 常用组合

pstree:显示进程树

pgrep:

-U Username         仅显示指定用户的进程的进程的PID

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

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

pidof command

top:

top - 10:35:59 up 2 days, 16:26,  3 users,  load average: 0.00, 0.00, 0.00

系统当前时间 系统运行时长 登录的用户 平均负载:1分钟,五分钟,15分钟

Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie

总进程数 运行进程数 休眠进程数 停止进程数 僵死进程数

Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

用户空间占比 系统占比 nice占比 空闲占比 等待占比 硬中断占比 软中断占比 被占用占比

Mem:   1918400k total,   406832k used,  1511568k free,   153868k buffers

Swap:  2097144k total,        0k used,  2097144k free,    90524k cached

M: 按内存占用百分比大小排序

P:按cpu占用百分比大小排序,默认

T:按累计占有时长进行排序

1:多CPU时按数字1可以分开显示

l: 是否显示负载信息

t:是否显示cpu和进程的统计信息

m:是否显示内存和交互分区的信息

q:退出

k:kill,杀掉进程

s:改变top刷新频率

常用选项:

-d # :指定刷新时间间隔

-n # :指定刷新的次数

-b :以批次显示top的刷新

htop

u:选择指定用户的进程

l: 显示进程所打开的文件列表

s:显示进程执行的系统调用

a:显示进程的进程的cpu上

#:快速将光标定位之指定的PID进程上

quit

vmstst

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  57460  54564 285520    0    0    30     5   21   14  0  0 99  1

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

in:中断发生频率。每秒的中断数

cs:context switch 上下文切换,进程切换,通常是速率,kb/s

cpu:

us:用户空间的使用率

sy:内核空间的使用率

id:空闲

wa:等待的

st:被偷走的

使用格式

vmstat [delay [counts]]

-s:显示内存统计数据

nice,renice

进程:nice

用来手动调整进程优先级,默认nice为0.其默认优先级为120

nice值取值范围 :-20,19

nice值对应优先级 :100,139

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

对于尚未启动的程序

nice -n # COMMAND 进程以#的nice值启动

对于运行中的进程:

renice # PID 调整指定PID的nice值

ps axo ni command pid 查看进程的nice值

进程间通信(IPC):

信号:

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

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

kill -SIGNAL PID 杀死指定进程(SINGAL可以使数字代号也可以是信号名称)

1) SIGHUP 让程序重读配置文件,而不用重启程序

2) SIGINT 中断信号。Ctrl+c即发送此信号

9) SIGKILL 杀死进程

15) SIGTERM 终止进程,比较优雅(默认)

killall -SIGNAL 进程名         杀死指定程序的所有进程

Linux的作业控制

前台作业:占据着一个终端

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

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

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

如果尚未启动:COMMAND &

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

nohup COMMAND &

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

fg [[%]作业号码]:将作业调回前台继续进行

bg [[%]作业号码]:让作业在后台继续进行

默认的为最后一个进入后台的任务

kill %作业号码:终止作业

查看作业号:

jobs

pmap pid 查看进程的内存占用情况

00007fb60640d000      4K    rw---  /sbin/init

起始地址              空间  权限

bash脚本编程:之case语句

case语句的语法格式:

case expression in

pattern1)

suite1

;;

pattern2)

suite2

;;

...

patternn)

suiten

;;

*)

other_suite

;;

esac

case中各pattern可以使用模式:

a|b a或者b

* 匹配任意长度的任意字符;

? 匹配任意单个字符;

[-] 范围匹配

练习:写一个脚本,接受如此格式

script.sh {start|stop|restart|status}

1、如是start,那么创建/var/lock/subsys/script.sh,显示启动成功;

2、如果参数是stop,则删除/var/lock/subsys/script.sh,显示停止成功

3、如果restart,则删除,再创建,显示成功;

4、如果status, 如果文件存在,则显示running,否则,显示stopped

#!/bin/bash

#

myService=`basename $0`

lockFile="/var/lock/subsys/$myService"

[ $# -lt 1 ] && echo "Usage: $myService {start|stop|restart|status}" && exit 4

case $1 in

‘start‘)

touch $lockFile

echo "Starting $myService OK"

;;

‘stop‘)

rm -f $lockFile

echo "Stopping $myService OK"

;;

‘restart‘)

rm -f $lockFile

touch $lockFile

echo "Restarting $myService OK"

;;

‘status‘)

if [ -f $lockFile ]; then

echo "$myService is running"

else

echo "$myService is stopped"

fi

;;

*)

echo "Usage: $myService {start|stop|restart|status}"

exit 3

;;

esac

练习:写一个脚本,能对/etc/目录进行打包备份,备份位置为/backup/etc-日期.后缀

1、显示如下菜单给用户:

xz) xz compress

gzip) gzip compress

bip2) bzip2 compress

2、根据用户指定的压缩工具使用tar打包压缩;

3、默认为xz;输入错误则需要用户重新输入;

#!/bin/bash

#

[ -d /backup ] || mkdir /backup

cat << EOF

Plz choose a compress tool:

xz) xz compress

gzip) gzip compress

bip2) bzip2 compress

EOF

while true; do

read -p "Your option: " option

option=${option:-xz}

case $option in

xz)

compressTool=‘J‘

suffix=‘xz‘

break ;;

gzip)

compressTool=‘z‘

suffix=‘gz‘

break ;;

bzip2)

compressTool=‘j‘

suffix=‘bz2‘

break ;;

*)

echo "wrong option." ;;

esac

done

tar ${compressTool}cf /backup/etc-`date +%F-%H-%M-%S`.tar.$suffix /etc/*

练习:写一个脚本,完成如下功能

说明:此脚本能够为指定网卡创建别名,指定地址;使用格式:mkethalias.sh -v|--verbose -i|--interface ethX

1、-i选项用于指定网卡;

2、如果网卡存在:在命令行,请用户指定一个别名;

3、让用户指定IP和掩码;

4、用户可以同时使用-v或--verbose选项:如果使用了,则在配置完成后,显示配置结果;否则,则不予显示;

#!/bin/bash

#

debug=0

while [ $# -ge 1 ]; do

case $1 in

-i|--interface)

ethcard="$2"

shift 2 ;;

-v|--verbose)

debug=1

shift

;;

*)

echo "Wrong options or arguments."

echo "Usage: `basename $0` [-v|--verbose] -i|--interface Interface"

shift $#

;;

esac

done

# echo "Interface: $ethcard , Verbose Flag: $debug "

! ifconfig $ethcard &> /dev/null && echo "No this interface..." && exit 3

read -p "Enter an alias: " ethAlias

read -p "Enter IP: " ipAddr

read -p "Mask: " netMask

ifconfig $ethAlias $ipAddr netmask $netMask

[ $debug -eq 1 ] && ifconfig $ethAlias

bash脚本编程之函数

可被调用:函数有函数名

函数出现的地方,会自动被替换成函数定义的代码

函数定义

语法:

FuncName() {

函数体

}

function FuncName {

函数体

}

函数有两种返回值:

正常返回的数据:

函数中的打印语句,如echo或print

函数中命令的执行结果

执行状态返回值:

取决于函数中执行的最后一条语句

自定义:return N

函数可以接受参数:

在函数体可以使用类似脚本调用位置参数一样的参数

$1, $2, ...

$#

$*, [email protected]

练习:写一个脚本,完成如下功能

1、显示如下菜单

disk) show disk info

mem) show memory info

cpu) show cpuinfo

2、显示用户选定的内容;

#!/bin/bash

#

ShowMenu() {

cat << EOF

disk) show disk info

mem) show memory info

cpu) show cpuinfo

EOF

}

main() {

ShowMenu

read -p "Plz choose an option: " option

case $option in

disk)

df -h

;;

mem)

free -m

;;

cpu)

cat /proc/cpuinfo

;;

*)

echo "Wrong option"

esac

}

main

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

在函数中使用了在主程序中声明的变量,重新赋值会直接修改主程序中的变量;

如果不期望函数与主程序中的变量冲突,函数中使用变量都用local修饰;即使用局部变量;

在函数中使用了在主程序中没有声明的变量,在函数执行结束后即被撤消,无论是否使用local修饰符;

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

使用$*传递

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

#!/bin/bash

Ping(){

ipAddr=172.16.$1.$2

ping -c 1 -w 1 $ipAddr >> /dev/null

if [ $? -eq 0 ];then

echo -e "\033[32m$ipAddr\033[0m"

else

echo -e "\033[31m$ipAddr\033[0m"

fi

}

for i in `seq 0 255`;do

for j in `seq 1 254`;do

Ping $i $j

done

done

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

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/对应的目录中,其要求命令;

#!/bin/bash

#

target=/mnt/sysroot

clearCmd() {

if which $cmd &> /dev/null; then

cmdPath=`which --skip-alias $cmd`

else

echo "No such command"

return 5

fi

}

cmdCopy() {

cmdDir=`dirname $1`

[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}

[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}

}

libCopy() {

for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do

libDir=`dirname $lib`

[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}

[ -f ${target}${lib} ] || cp $lib ${target}${libDir}

done

}

while true; do

read -p "Enter a command: " cmd

if [ "$cmd" == ‘quit‘ ] ;then

echo "quit"

exit 0

fi

clearCmd $cmd

[ $? -eq 5 ] && continue

cmdCopy $cmdPath

libCopy $cmdPath

done

时间: 2024-08-10 19:19:14

10、进程管理,case和函数 学习笔记的相关文章

contiki-main.c 中的process系列函数学习笔记 &lt;contiki学习笔记之六&gt;

说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ------------------------------------------------------------------------------------------------------------------------------------- 根据上一个笔记里面添加的printf()语句的打印信息提示,hello world 打印是在执行了 1 autostart_

代码管理工具 --- git的学习笔记四《重新整理git(1)》

1.创建版本库 mkdir  创建目录 cd  地址,到该地址下 pwd 显示当前目录 1.创建目录 $ mkdir startGit $ cd startGit $ pwd 显示当前目录 或者cd到桌面,然后再创建目录 2.初始化版本库 $ git init 初始化仓库 提示信息:Initialized empty Git repository in /Users/xingzai/Desktop/startGit/.git/ 建立一个空的git仓库在/Users/xingzai/Desktop

C++运算符重载为友元函数学习笔记

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 下面的两种情况发生,则我们需要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能访问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };

UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork 创建的新进程与调用进程之间的关系.父子进程的数据共享问题等.fork 是否可以无限制的调用?如果不行的话,最大限制是多少?另外,我们还将学习一个 fork 的变体 vfork. 1 fork 创建的新进程与调用进程之间的关系 UNIX 操作系统中的所有进程之间的关系呈现一个树形结构.除了进程 ID

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

generator函数学习笔记

一.基本概念 Generator函数是一种可以暂停执行,返回iterator对象的函数,yield是暂停标识 function* gen(){ yield 1; yield 2; } Generator函数在function后面有一个*,内部有yield语句 function* gen(){ yield 1; yield 2; return '1' } let g = gen(); //调用Generator函数返回遍历器对象 console.log(g.next())//{"value&quo

UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串

lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串.其声明如下, #include <stdlib.h> int system(const char *cmdstring); system 函数在其实现中调用了 fork.exec 和 waitpid 函数.system 函数调用 fork 函数创建子进程,然后由子进程调用’/bin/sh -c cmdstring’ 来执行命令行参数 cmdstring,此命令执行完后便返回调用的进程

Swift2.0 函数学习笔记

最近又有点忙,忙着找工作,忙着适应这个新环境.现在好了,上班两周周了,也适应过来了,又有时间安安静静的就行我们前面的学习了.今天这篇笔记,记录的就是函数的使用.下面这些代码基本上是理清楚了函数的额使用,但还有一块“闭包”的内容,后面我们单独写一块出来. // 形参传递的过程中,由于没有写外部形参名称,第一个形参的外部形参名字可以省略,第二的的不可以省略 let zxtest = testString(1, zc: 2) print(zxtest) // 返回值是一个元组的形式返回到,参数的传递和

pythonの函数学习笔记(一)

函数是可以实现一些特定功能的小方法或小程序定义函数function的方法:def function_name(arg1,arg2[,...]): statement [return value]注意事项:1.def开头,代表定义函数,def和函数名中间要敲一个空格:2.返回值不是必须的,如果没有renturn语句,则默认返回值None:3.函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合,区分大小写且不能是保留字: py使用名称空间的概念存储对象,这个名称空间就是对象作用的区域