企鹅日记(十六):linux程序管理

康源留言 2013-04-04

在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/

相关推荐