--- layout: post title: Linux进程管理 tags: Linux 进程管理 categories: Linux --- * TOC {:toc} ## `&` **将命令放在后台运行** command & 此时将会产生1个任务编号与一个PID,命令执行完成后将会在前台出现提示 >后台执行的任务如果存在信息输出,最好将其写入到文件,否则将会在前台显示,影响操作 --- ## `[ctrl]-z` **将命令放在后台暂停** 此时将会产生1个任务编号及其命令 --- ## `jobs` **查看后台任务状态** [root@www ~]# `jobs [-lrs]` 选项与参数: `-l` :除了列出 job number 与命令串之外,同时列出 PID 的号码; `-r` :仅列出正在背景 run 的工作; `-s` :仅列出正在背景当中暂停 (stop) 的工作。 >`+` 代表最近被放到背景的工作号码, `-` 代表最近最后第二个被放置到背景中的工作号码,其余没有符号 --- ## `fg` **将后台任务放到前台** [root@www ~]# `fg %jobnumber` 选项与参数: `%jobnumber` :jobnumber 为任务号码(数字),那个 % 是可有可无的! --- ## `bg` **将后台暂停的任务变为运行中** [root@www ~]# `bg %jobnumber` --- ## `kill` **移除任务** [root@www ~]# `kill -signal %jobnumber` [root@www ~]# `kill -l` 选项与参数: `-l` :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些 `signal` :代表给予后面接的那个工作什么样的指示罗!用 man 7 signal 可知: > `-1` :重新读取一次参数的配置档 (类似 reload); > > `-2` :代表与由键盘输入 [ctrl]-c 同样的动作; > > `-9` :立刻强制删除一个工作; > > `-15`:以正常的程序方式终止一项工作。与 -9 是不一样的。 --- ## `nohup` **离线任务** >`!特别说明` 前面的几个命令中所谓的"背景”,都是指终端机背景(不会被ctrl+c中断),并非系统背景,一旦退出终端,任务立即终止。`nohup`可以在退出终端后继续执行任务。 [root@www ~]# `nohup` [命令与参数] <==在终端机前台中工作 [root@www ~]# `nohup` [命令与参数] & <==在终端机后台中工作 --- ## `pstree` **显示进程树** [root@www ~]# `pstree [-A|U] [-up]` 选项与参数: `-A` :各程序树之间的连接以 ASCII 字节来连接; `-U` :各程序树之间的连接以万国码的字节来连接。在某些终端介面下可能会有错误; `-p` :并同时列出每个 process 的 PID; `-u` :并同时列出每个 process 的所属帐号名称。 --- ## `ps` **将某个时间点的程序运行情况撷取下来** [root@www ~]# `ps aux` <==观察系统所有的程序数据 [root@www ~]# `ps -lA` <==也是能够观察所有系统的数据 [root@www ~]# `ps axjf` <==连同部分程序树状态 选项与参数: `-A` :所有的 process 均显示出来,与 -e 具有同样的效用; `-a` :不与 terminal 有关的所有 process ; `-u` :有效使用者 (effective user) 相关的 process ; `x` :通常与 a 这个参数一起使用,可列出较完整资讯。 输出格式规划: `l` :较长、较详细的将该 PID 的的资讯列出; `j` :工作的格式 (jobs format) `-f` :做一个更为完整的输出。 --- ### `ps -l` **仅观察自己的 bash 相关程序** `F`:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有: >若为 `4` 表示此程序的权限为 root ; > >若为 `1` 则表示此子程序仅进行复制(fork)而没有实际运行(exec)。 `S`:代表这个程序的状态 (STAT),主要的状态有: >`R` (Running):该程序正在运行中; > >`S` (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。 > >`D` :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>列印) > >`T` :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态; > >`Z` (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。 `UID/PID/PPID`:代表此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码 `C`:代表 CPU 使用率,单位为百分比 `PRI/NI`:Priority/Nice 的缩写,代表此程序被 CPU 所运行的优先顺序,数值越小代表该程序越快被 CPU 运行 `ADDR/SZ/WCHAN`:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『 - 』 / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运行中,同样的, 若为 - 表示正在运行中。 `TTY`:登陆者的终端机位置,若为远程登陆则使用动态终端介面 (pts/n); `TIME`:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行的时间,而不是系统时间; `CMD`:就是 command 的缩写,造成此程序的触发程序之命令为何 --- ### `ps aux` **观察系统所有程序** `USER`:该 process 属於那个使用者帐号的? `PID` :该 process 的程序识别码。 `%CPU`:该 process 使用掉的 CPU 资源百分比; `%MEM`:该 process 所占用的实体内存百分比; `VSZ` :该 process 使用掉的虚拟内存量 (Kbytes) `RSS` :该 process 占用的固定的内存量 (Kbytes) `TTY` :该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 `STAT`:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z) `START`:该 process 被触发启动的时间; `TIME` :该 process 实际使用 CPU 运行的时间。 `COMMAND`:该程序的实际命令为何? >ps结果后接 `` 表示为僵尸程序 --- ## `top` **动态观察程序的变化** [root@www ~]# `top [-d 数字] | top [-bnp]` 选项与参数: `-d` :后面可以接秒数,就是整个程序画面升级的秒数。默认是 5 秒; `-b` :以批量的方式运行 top ,还有更多的参数可以使用,通常会搭配数据流重导向来将批量的结果输出成为文件。 `-n` :与 -b 搭配,意义是,需要进行几次 top 的输出结果。 `-p` :指定某些个 PID 来进行观察监测。 在 top 运行过程当中可以使用的按键命令: `?` :显示在 top 当中可以输入的按键命令; `P`:以 CPU 的使用资源排序显示; `M` :以 Memory 的使用资源排序显示; `N` :以 PID 来排序喔! `T` :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。 `k` :给予某个 PID 一个讯号 (signal) `r` :给予某个 PID 重新制订一个 nice 值。 `q` :离开 top 软件的按键。 --- **`echo $$`** ( 查看bash的pid) --- ## `signal` | 代号 | 名称 | 内容 | |:----:|:----:|:----| | 1 | SIGHUP | 启动被终止的程序,可让该 PID 重新读取配置,类似重新启动 | | 2 | SIGINT | 相当於用键盘输入 [ctrl]-c 来中断一个程序 | | 9 | SIGKILL | 强制中断一个程序,尚未完成的部分可能会有遗留物| | 15 | SIGTERM | 正常结束程序,如果该程序已经发生问题,signal将失效 | | 17 | SIGSTOP | 相当於用键盘输入 [ctrl]-z 来暂停一个程序 | --- ## `kill` **杀死进程** [root@www ~]# `kill PID` `!特别说明`:kill后面直接加数字表示杀死进程,这与上面的移除任务用法是不同的 --- ## `killall` **按程序启动命令杀死进程** [root@www ~]# ` killall [-iIe] [command name]` 选项与参数: `-i` :interactive 互动的意思,删除时,会出现提示 `-e` :exact 准确的意思,后面接的 command name要与运行中程序的启动命令一致,但整个完整的命令不能超过 15 个字节(若程序启动时使用了参数,则程序名与后面接的参数作为整体) `-I` :命令名称(可能含参数)忽略大小写。 --- ## `nice` **指定nice值启动新程序** [root@www ~]# `nice [-n 数字] command` 选项与参数: `-n` :后面接一个数值,数值的范围 -20 ~ 19。 --- ## `renice` **重设指定程序的nice值** [root@www ~]# `renice [number] PID` 选项与参数: `PID` :某个程序的 ID --- ## `free` **观察内存使用情况** [root@www ~]# `free [-b|-k|-m|-g] [-t]` 选项与参数: 默认单位为 Kbytes,可以使用 `-b`(bytes),`-m`(Mbytes),`-k`(Kbytes),`-g`(Gbytes) 来显示单位 `-t` :显示实体内存与 swap 的总量。 --- ## `uname` **查看系统核心信息** [root@www ~]# `uname [-asrmpi]` 选项与参数: `-a` :所有系统相关的资讯,包括底下的数据都会被列出来; `-s` :系统核心名称 `-r` :核心的版本 `-m` :本系统的硬件名称,例如 i686 或 x86_64 等; `-p` :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型! `-i` :硬件的平台 (ix86) --- ## `uptime` **观察系统启动时间与工作负载** --- ## `netstat` **追踪网络与Socket** [root@www ~]# `netstat -[atunlp]` 选项与参数: `-a` :将目前系统上所有的连线、监听、Socket 数据都列出来 `-t` :列出 tcp 网络封包的数据 `-u` :列出 udp 网络封包的数据 `-n` :不以程序的服务名称,以端口号 (port number) 来显示; `-l` :列出目前正在网络监听 (listen) 的服务; `-p` :列出该网络服务的程序 PID 网络参数 `Proto` :网络的封包协议,主要分为 TCP 与 UDP 封包,相关数据请参考服务器篇; `Recv-Q`:非由使用者程序连结到此 socket 的复制的总 bytes 数; `Send-Q`:非由远程主机传送过来的 acknowledged 总 bytes 数; `Local Address` :本地端的 IP:port 情况 `Foreign Address`:远程主机的 IP:port 情况 `State` :连线状态,主要有创建(ESTABLISED)及监听(LISTEN); 本机程序 `Proto` :一般就是 unix 啦; `RefCnt`:连接到此 socket 的程序数量; `Flags` :连线的旗标; `Type` :socket 存取的类型。主要有确认连线的 STREAM 与不需确认的 DGRAM 两种; `State` :若为 CONNECTED 表示多个程序之间已经连线创建。 `Path` :连接到此 socket 的相关程序的路径!或者是相关数据输出的路径。 --- ## `dmesg` **查看核心产生的信息** --- ## `vmstat` **侦测系统资源变化** [root@www ~]# `vmstat [-a] [间隔时间] [总次数]]` <==CPU/内存等资讯 [root@www ~]# ` vmstat [-fs]` <==内存相关 [root@www ~]# `vmstat [-S 单位]` <==配置显示数据的单位 [root@www ~]# `vmstat [-d]` <==与磁碟有关 [root@www ~]# `vmstat [-p 分割槽]` <==与磁碟有关 选项与参数: `-a` :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出资讯; `-f` :启动到目前为止,系统复制 (fork) 的程序数; `-s` :将一些事件 (启动至目前为止) 导致的内存变化情况列表说明; `-S` :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量; `-d` :列出磁碟的读写总量统计表 `-p` :后面列出分割槽,可显示该分割槽的读写总量统计表 >内存栏位 (`procs`) 的项目分别为: >>`r` :等待运行中的程序数量;`b`:不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被运行或一直在等待而无法被唤醒之故)。 >内存栏位 (`memory`) 项目分别为: >>`swpd`:虚拟内存被使用的容量; `free`:未被使用的内存容量; `buff`:用於缓冲内存; `cache`:用於高速缓存。 这部份则与 `free` 是相同的。 >内存置换空间 (`swap`) 的项目分别为: >>`si`:由磁碟中将程序取出的量; `so`:由於内存不足而将没用到的程序写入到磁碟的 `swap` 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁碟与主内存之间传来传去,系统效能会很差! >磁碟读写 (`io`) 的项目分别为: >>`bi`:由磁碟写入的区块数量; `bo`:写入到磁碟去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌! >系统 (`system`) 的项目分别为: >>`in`:每秒被中断的程序次数; `cs`:每秒钟进行的事件切换次数;这两个数值越大,代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁碟、网络卡、时间钟等。 >`CPU` 的项目分别为: >>`us`:非核心层的 CPU 使用状态; `sy`:核心层所使用的 CPU 状态; `id`:闲置的状态; `wa`:等待 I/O 所耗费的 CPU 状态; `st`:被虚拟机器 (virtual machine) 所盗用的 CPU 使用状态 (2.6.11 以后才支持)。 --- ## `fuser` **查看使用指定的文件或文件系统的进程** [root@www ~]# `fuser [-umv] [-k [i] [-signal]]` file/dir 选项与参数: `-u` :除了程序的 PID 之外,同时列出该程序的拥有者; `-m` :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效! `-v` :可以列出每个文件与程序还有命令的完整相关性! `-k` :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID; `-i` :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿! `-signal`:例如 -1 -15 等等,若不加的话,默认是 SIGKILL (-9) 罗! >权限: `c` :此程序在当前的目录下(非次目录); `e` :可被触发为运行状态; `f` :是一个被开启的文件; `r` :代表顶层目录 (root directory); `F` :该文件被开启了,不过在等待回应中; `m` :可能为分享的动态函式库; --- ## `lsof` **列出由程序开启的文件** [root@www ~]# `lsof [-aUu] [+d]` 选项与参数: `-a` :多项数据需要『同时成立』才显示出结果时!(内连接`?`) `-U` :仅列出 Unix like 系统的 socket 文件类型; `-u` :后面接 username,列出该使用者相关程序所开启的文件; `+d` :后面接目录,即找出某个目录底下已经被开启的文件! --- ## `pidof` **找出某个正在的运行程序的pid** [root@www ~]# `pidof [-sx] program_name...` 选项与参数: `-s` :仅列出一个 PID 而不列出所有的 PID `-x` :同时列出该 program name 可能的 PPID 那个程序的 PID