《Unix & Linux 大学教程》 - 第二十六章(二) 学习笔记
学习笔记,内容基础,适合初学者。
阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)
《Unix & Linux 大学教程》 - 第一、二章 学习笔记 Unix简介 & 什么是Linux?什么是Unix第二十六章(二):进程和作业控制
ps
选项分为三组:UNIX选项、BSD选项和仅适用与GNU的选项
UNIX选项通常以连字符(-)开头,BSD选项前没有连字符
如果是混合系统,必须适用BSD选项才能进行BSD输出
语法:
UNIX选项基本语法
ps [-aefFly] [-ppid] [-u userid]
BSD选项基本语法
ps [ajluvx] [-p pid] [-u userid]
UNIX选项信息
显示哪些进程?ps与您的用户标识和终端相关的进程ps -a与任何用户标识和终端的相关进程ps -e所有进程(包括守护进程)ps -p pid与指定进程ID pid相关的进程ps -u userid与指定用户标识userid相关的进程显示哪些数据列psPID TTY TIME CMDps -fUID PID PPID C TTY TIME CMDps -FUID PID PPID C SZ RSS STIME TTY TIME CMDps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMDps -lyS UID PID PPID C PRI NI RSS SZ WCHAN TTY TIME CMD有用的特殊组合ps显示自己的进程ps -ef显示所有用户进程,完整输出ps -a显示所有非守护进程的进程ps -t -仅显示所有守护进程UNIX列标题含义
*******************************************************
BSD选项信息
显示哪些进程?ps与您的用户标识和终端相关的进程ps a与任何用户标识和终端的相关进程ps e所有进程(包括守护进程)ps p pid与指定进程ID pid相关的进程ps U userid与指定用户标识userid相关的进程显示哪些数据列psPID TT STAT TIME COMMANDps jUSER PID PPID PGID SESS JOBC STAT TT TIME COMMANDps lUID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMANDps uUSER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMANDps vPID STAT TIME SL RE PAGEIN VSZ RSS LIM TSIZ %CPU %MEM COMMAND有用的特殊组合ps显示自己的进程ps ax显示所有进程ps aux显示所有进程,完整输出(p719,把VSZ解释为虚拟大小,应该是笔误吧)
状态代码含义
Linux、FreeBSDD不可中断睡眠:等待事件结束(通常是I/O,D=“磁盘”)I空闲:超过20秒的睡眠(仅适用于FreeBSD)R正在运行或可运行(可运行=正在运行队列中等待)S可中断睡眠:等待事件结束T挂起:由作业控制信号挂起或者因为追踪而被挂起Z僵进程:终止后,父进程没有等待----------------------------------------------------------
监视系统进程:top、prstat
top(大多数Linux和BSD系统可以使用)
语法:
top [-d delay] [-ncount] [-p pid[,pid]...]
delay是刷新时间间隔(单位为秒)
count是刷新的总时间量
pid是进程ID
注意:系统之间,选项可能有所不同,建议先查看man手册
比如我的手机上面是这个样子的:
$ top -h
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num Maximum number of processes to display.
-n num Updates to show before exiting.
-d num Seconds to wait between updates.
-s col Column to sort by (cpu,vss,rss,thr).
-t Show threads instead of processes.
-h Display this help screen.
h:帮助
q或^C:退出
<Space>:强制top立即刷新显示(该命令通常不被记录)
(我这里就没有记录 - Help for Interactive Commands - procps version 3.2.8)
(我的手机上不支持这个命令,当然,也不支持h,q。HTC android4.0)
显示进程树:pstree(有的系统使用ptree作为替代,Solaris上用prstat)
语法:
pstree [-aAcGnpu] [pid |userid]
-c(do not compact):不要压缩
-A:强制使用ASCII字符
-G:使用行绘制字符
-p:显示每个进程的PID
-n:按PID对进程排序(默认是按进程名排序)
-a(all,全部):显示全部信息
-u(userid change,用户标识改变):选项标识当子进程以不同于父进程的用户标识运行时所发生的改变
下面是在我手机上面执行pstree后的输出,截取了一段
shell@android:/ # busybox pstree
busybox pstree
init-+-DxDrmServerIpc-+-2*[{Binder Thread }]
| `-5*[{DxDrmServerIpc}]
|-adbd-+-sh---sh---busybox
| `-4*[{adbd}]
|-dbus-daemon
|-debuggerd
|-drmserver---3*[{Binder Thread }]
|-hdmid-+-{Binder Thread }
| `-{HDMIDaemon}
|-htc_ebdlogd---logcat2
其中2*表示两个完全相同的进程
fuser
作用:将文件与进程联系起来
下面是一个书中的例子,会打印出PID和作业号
find / -name foo -print > bar 2>/dev/null &
[3] 3456
fuser bar
bar: 3456
fuser显示出哪个进程正在使用bar文件
注意:如果不是系统用户,fuser可能不会位于你的搜索目录,可以使用whereis来找到fuser的位置
kill
语法:
kill [-signal]pid... | jobid...
pid或jobid用来标识进程
如果不指定signal,默认发送TERM
注意:kill可以与fg和bg相同的方式指定作业号
信号列表
编号名称缩写描述1SIGHUPHUP中止:注销或者终端失去连接时发送给进程2SIGINTINT中断:当按下^C键时发送9SIGKILLKILL杀死:立即终止,进程不能捕获15SIGTERMTERM终止:请求终止,进程不能捕获18SIGCONTCONT继续:恢复挂起的进程,由fg或bg发送19SIGSTOPSTOP停止(挂起):当^Z键时发送当使用kill向进程发送信号时,可以使用信号的编号、名称或者缩写
注意:各个系统之间信号的编号可能有所不同,所以最好使用名称或缩写,这些是标准化的
kill -l:查看系统支持的全部信号列表
下面是我手机上面支持的信号
kill -l
1 HUP Hangup 17 CHLD Child exited
2 INT Interrupt 18 CONT Continue
3 QUIT Quit 19 STOP Stopped (signal)
4 ILL Illegal instruction 20 TSTP Stopped
5 TRAP Trap 21 TTIN Stopped (tty input)
6 ABRT Aborted 22 TTOU Stopper (tty output)
7 BUS Bus error 23 URG Urgent I/O condition
8 FPE Floating point exception 24 XCPU CPU time limit exceeded
9 KILL Killed 25 XFSZ File size limit exceeded
10 USR1 User signal 1 26 VTALRM Virtual timer expired
11 SEGV Segmentation fault 27 PROF Profiling timer expired
12 USR2 User signal 2 28 WINCH Window size changed
13 PIPE Broken pipe 29 IO I/O possible
14 ALRM Alarm clock 30 PWR Power failure
15 TERM Terminated 31 SYS Bad system call
16 STKFLT Stack fault
如果不支持此选项,可以搜索signal.h这个文件
通常,HUP、INT、KILL和TERM的信号编号在所有系统上面都是相同的
当一个前台程序失去响应,按^C也无法停止,那么可以:
1尝试^Z挂起程序,如果成功,使用ps或者jobs找到进程,然后kill
2打开新终端,ps -u或者ps U列举你的用户标识运行的进程,然后kill
3如果使用的是远程Unix,可以尝试断开与主机的连接。(在一些系统上,断开与主机的连接时,内核会自动杀死你所有的进程)
设置进程优先级
nice
语法:
nice [-n adjustment]command
adjustment是一个数值
command是希望运行的命令
大多数系统上,adjustment的范围是0-19,超级用户可以设置的范围为-20-19,数字越大,优先级越低
adjustment默认=10
当以普通方式运行程序时(不使用nice),nice值为0
注意:nice只能应用于自己独立存在的程序
可以对外部命令和shell脚本应用nice,但是shell内部命令、管道线或复合命令不能降低优先级
改变现有进程优先级
renice
语法:
renice niceness -pprocessid
niceness是nice值
processid是进程ID
常规用户只能修改自己进程的nice值
常规用户使用renice只能降低进程优先级
守护进程
守护进程是一种在后台运行,不与任何终端相连,提供服务的进程。
Unix通常有许多守护进程
可以使用下面命令查看守护进程
ps -t - | less
如果系统不支持,可以考虑
ps -e | grep '?' | less
使用ps命令时,TTY列显示问号的(?)表示该进程不受终端控制
大多数守护进程是在启动的最后一部分自动创建的
在一些情形中,这些进程由初始化进程创建
另一些情形中,这些进程由终止自身的父进程创建,然后init会收养这些孤儿,从而他们的父进程变为init
Linux系统中,/etc/rc.d/init.d目录下有大量shell脚本,每个shell脚本都是用来启动、停止或者重新启动一个特定的守护进程
一些Unix守护进程
守护进程目的init其他所有进程的祖先,收养孤儿apacheApache Web服务器atd运行at程序排列的作业crond管理预调度作业的执行(cron服务)cupsd打印调度器(CUPS=Common Unix Printing System,通用Unix打印系统)dhcpd为客户端动态配置TCP/IP信息(DHCP)ftpdFTP服务器(File Transfer Protocol,文件传输协议)gated网络的网关路由httpdWeb服务器inetdInternet服务kerneld根据需要加载或卸载内核模块kudzu在启动过程中检测并配置新/改变过的硬件lpd打印队列(行打印机守护进程)mysqlMYSQL数据库服务器namedInternet DNS服务器(DNS=Domain Name System,域名系统)nfsd网络文件访问(NFS=Network File System,网络文件系统)ntpd时间同步(NTP=Network Time Protocol,网络时间协议)rpcbind远程过程调度(RPC)routed管理网络路由表schedswapper的另一个名称sendmailSMTP服务器(电子邮件)smbdWindows客户端的文件共享&打印服务(Samba)sshdSSH(安全shell)连接swapper将数据从内存复制到交换空间,回收物理内存syncd文件系统与内存内容的同步syslogd收集各种系统消息(系统日志记录器)xinetdInternet服务(取代inetd)转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/