企鹅日记(十六):linux程序管理
在linux当中,触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个PID,同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置,从此以后,这个PID就够在系统上进行的操作就与这个PID的权限有关了。进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限,比如登录bash这个进程,在bash中执行其他程序,产生的进程的权限就是这个bash的权限。
父子进程,可通过PPID找到该进程的父进程
====工作管理 job control====
主要指的是在一个bash环境下同时执行多个任务,多个工作。
# tar -zpcf /tmp/etc.tar.gz /etc &
# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
将目前的工作丢到后台中“暂停”:CTRL + Z
# jobs [-lrs]
-l:除了列出job number与命令串外,同时列出PID
-r:仅列出正在后台run的工作
-s:仅列出正在后台stop的工作
+ 代表最近被放到后台的工作号码
- 代表最后第二个被放到后台中的工作号码,其他神马都不显示
# fg %jobnumber <==将后台工作拿到前台来处理
# bg %jobnumber <==将后台工作变成run状态,让它运行起来
# kill -signal %jobnumber
# kill -l
-l:列出目前kill能够使用的signal有哪些
-2:代表由键盘输入 CTRL + C同样的操作
-9:立刻强制删除一个工作
-15:以正常的程序方式终止一项工作
====脱机管理问题====
job管理中程序与终端机有关(因为是bash的子进程),如果远程连接后断开,后台的jobs都消失了。于是:
# nohup [命令与参数] <== 在终端机前台中工作
# nohup [命令与参数] <== 在终端机后台中工作
nohup并不知道bash内部命令,所以你的命令全部都应该是外部命令(因为bash命令和终端机会绑定啊。。)
====进程的查看====
# ps aux <===查看系统所有进程数据
# ps -lA <==也是查看系统所有进程数据
# ps axjf <==联通部分进程树状态
-A:所有进程均显示,与-e有相同的作用
-a:不与terminal相关的所有进程
-u:有效用户相关的进程
x:通常与a参数一起使用,可列出较完整的信息
输出格式规划:
l:较长,较详细的将该PID信息列出
j:工作的格式
-f:做一个更完整的输出,包含父子树结构
其实只需要记住两个就行:
ps -l : 查看自己bash程序相关的进程
[yidao@localhost ~]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 2220 2218 0 80 0 – 34449 wait pts/0 00:00:00 bash
0 R 1000 3006 2220 0 80 0 – 33916 – pts/0 00:00:00 ps
# ps -lA显示的格式与上面的ps -l一样,数据相跟下面的ps aux一样,显示系统上所有进程数据
ps aux:查看所有系统运行的进程
[yidao@localhost ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 45852 4484 ? Ss 20:47 0:01 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 20:47 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 20:47 0:00 [ksoftirqd/0]
解释下ps aux的各个字段含义:
USER:该进程属于哪个用户帐号,即由哪个用户触发
PID:不解释
%CPU:不解释
%MEM:不解释
VSZ:该进程使用掉的虚拟内存量(KB)
RSS:该进程占用的固定的内存量(KB)
TTY:该进程是在哪个终端机上运行,若与终端机无关则显示? 另外,tty1~tty6是本机上面登陆者程序,若为pts/0等,则表示为由网络连接进主机的进程。
STAT:该进程目前状态,主要有:
* R(Running):该进程正在运行中
* S(Sleeping):正在睡眠,可以被唤醒
* D:不可被唤醒状态
* T:停止状态
* Z:Zombie,僵尸状态,进程已终止但无法将其从内存中删除
START:进程被触发的时间
TIME:进程实际使用了CPU运行的时间
COMMAND:该进程的实际命令
# ps axjf <==显示进程树,你懂的
动态查看进程变化:
# top [-d 数字]
# top [-bnp]
-d:后面接数字,就是整个界面刷新的秒数,默认5秒
-b:以批次方式执行top,还可数据流重导向。。。
-n:与-b搭配,意思是几次top输出结果
-p:指定PID进行专门查看特定进程状态
top执行过程中常用按键:
?:显示top中可以输入的按键
P:以CPU使用排序
M:以内存使用排序
N:以PID排序
T:该进程使用CPU累计时间(TIME+)排序
k:给予某个PID一个信号signal
r:给予某个PID重新定制一个Nice值
q:离开quit
# top -d 2
top – 21:51:51 up 1:04, 2 users, load average: 0.29, 0.30, 0.34
Tasks: 168 total, 2 running, 166 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.6%us, 1.5%sy, 0.0%ni, 94.1%id, 0.4%wa, 0.3%hi, 0.1%si, 0.0%st
Mem: 3950684k total, 1224448k used, 2726236k free, 97148k buffers
Swap: 2097148k total, 0k used, 2097148k free, 577636k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2358 yidao 20 0 655m 58m 20m S 15.4 1.5 9:48.58 plugin-containe
1660 yidao 9 -11 539m 7692 5476 S 5.0 0.2 2:26.63 pulseaudio
763 root 20 0 147m 18m 8632 S 1.5 0.5 2:23.29 Xorg
2128 yidao 20 0 998m 159m 36m S 0.5 4.1 4:49.91 firefox
2218 yidao 20 0 434m 15m 11m S 0.5 0.4 0:02.98 Terminal
…..下面省略
解释下:
第一行的信息分别为:
* 目前的时间:21:51:51
* 开机到目前为止所经历的时间:up 1:04,说明我开机了1个小时4分钟
* 系统在1,5,15分钟的平均工作负载。若高于1得要注意了
第二行Tasks显示目前进程总量与个别进程在神马状态(running,sleeping,stopped,zombie)比较需要注意的是那个zombie,如果不是0,好好看看到底哪个进程变成了僵尸进程。
第三行Cpus显示的是Cpu整体负载,每个选项可使用?查阅。特别需要注意的是那个%wa,代表的是IO wait,如果是多核CPU,可以按1切换不同CPU负载率。
第四行与第五行:目前物理内存与虚拟内存的使用情况。要注意的是那个swap内存使用要尽量少。
第六行“这个是当在top进程中输入命令时显示的地方。
top的下面,也解释下:
PID:不解释
USER:该进程所属的用户
PR:Priority的简写,进程的优先级,越小优先级越高,越早被执行。
NI:Nice的简写,与Priority有关,越小越早被执行。
%CPU:不解释
%MEM:不解释
TIME+:CPU累计使用时间
注意:top默认以CPU使用率排序,可以按M按内存排序,恢复就按P,再次按CPU排序
批次显示方式示例:
# top -b -n 2 > /tmp/top.txt
进程树显示:
# pstree [-A|U] [-up]
-A:各进程树的连接以ASCII字符连接
-U:各进程树连接以UTF-8字符连接
-p:同时列出进程的PID
-u:同时列出每个进程的所属帐号名称
# ps -Aup
====进程的管理====
常见的signal:
1:SIGHUP,启动被终止的进程,类似于重启程序
2:SIGINT,相当于键盘输入CTRL+C中断一个进程
9:SIGKILL,强制终止
15:SIGTERM,正常结束,类似文件的叉叉关闭等
17:SIGSTOP,相当于键盘输入CTRL+Z暂停一个进程运行
# killall -iIe command
-i:互动模式,询问
-e:exact,后面接的command要完全一致
-I:命令忽略大小写
和kill相比,killall是根据命令名控制,而kill是根据PID控制。了解否
进程的优先级:
由于PRI是内核动态调整,用户无法干涉PRI,只能调整Nice值了。
因为 PRI(new) = PRI(old)+ nice
还有一点,nice只能越调越高,不能下降,囧。。
新执行的命令给予初始nice值:
# nice -n 数值 command
已经存在的进程调整nice值:
# renice number PID
====系统资源查看====
利用free查看内存使用情况:
# free [-b|-k|-m|-g] [-t]
-b:单位是字节,其他几个不解释
-t:在输出的结果中显示物理内存与swap总量
查看与内核相关信息uname:
# uname [-asrmpi]
-a:所有系统相关的信息,包括下面的所有数据都列出来
-s:系统内核名
-r:内核版本
-m:本系统硬件名,如i686或x86_64等
-p:CPU类型
-i:硬件平台(ix86)
查看系统启动时间与工作负载:uptime
# uptime
跟踪网络netstat:
# netstat -[atunlp]
-a:将目前系统上所有的连接、监听、socket数据都列出来
-t:列出tcp网络数据包的数据
-u:列出udp网络数据包的数据
-n:不列出进程服务名,以端口号port number来显示
-l:列出目前正在监听listen的服务
-p:列出该网络服务的进程PID
[yidao@localhost ~]$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 1 0 localhost.localdo:38354 220.181.124.7:http CLOSE_WAIT
tcp 1 0 localhost.localdo:50608 220.181.124.6:http CLOSE_WAIT
tcp 0 0 localhost.localdo:39539 shell.cjb.net:ssh ESTABLISHED
tcp 0 0 localhost.localdo:53722 113.105.146.67:http TIME_WAIT
tcp 1 0 localhost.localdo:43610 220.181.124.4:http CLOSE_WAIT
tcp 0 0 localhost.localdo:42858 118.186.66.51:http TIME_WAIT
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 10302 /run/systemd/notify
unix 2 [ ] DGRAM 9310 /run/systemd/journal/syslog
…下面省略
解释下:
Proto:网络数据包协议,主要TCP 和 UDP
Recv-Q:非由用户进程连接到此的socket的复制的总字节数
Send-Q:非由远程主机传过来的acknowledged总字节数
LocalAddress:本地IP端口
ForeignAddress:远程主机IP端口
State:连接状态,主要有建立ESTABLISED以及监听LISTEN
除了上面的网络上的连接外,linux系统下进程间通过socket通信,进程间的数据有传送,下面一长串就是进程间通信数据。
Proto:一般就是Unix
RefCnt:连接到此socket的进程数量
Flags:连接标识
Type:socket访问类型。主要有确认连接STREAM与不需要确认的DGRAM两种
State:若为CONNECTED表示已连接
Path:连接到此socket的相关程序路径
范例二:找出目前系统上已在监听的网络连接及其PID:
[yidao@localhost ~]$ netstat -tlnp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:7070 0.0.0.0:* LISTEN 2292/ssh
dmesg:分析内核产生的信息
vmstat:检测系统资源变化
fuser:通过文件或文件系统找出正在使用该文件的程序
# fuser [-umv] [-k [i] [-signal]] file/dir
-u:除了进程PID外,同时列出该进程的所有者
-m:对umount不成功很有效
-v:列出每个文件与程序还有命令的完整相关性
-k:找出使用该文件/目录的PID,并试图以SIGKILL这个信号给予该PID
-i:必须与-k结合使用,先询问用户再干掉这个进程
-signal:默认-9,强制终止
$ fuser -uv .
# lsof:列出被进程所打开的文件名
# lsof [-aUu] [+d]
-a:多项数据需要同时成立才显示结果
-U:仅列出Unix Like 系统的socket文件类型
-u:后接username,列出该用户相关进程所打开的文件
+d:后接目录,即找出某个目录下面已经被打开的文件
# lsof +d .
# lsof -u root | grep “bash”
=====================END======================
本人博客已搬家,新地址为:http://yidao620c.github.io/