在主目录中,用文本编辑器创建一个文本文件badpro,如下:
#! /bin/bash
while echo "I'm making files!!"
do
mkdir adir
cd adir
touch afile
sleep 2s
done
将该文件设定为可执行文件,然后在后台执行:
chmod +x badpro
./badpro & #在命令后加 &,表示 将该命令在后台执行
之所以要将该程序在后台执行,是因为在前台执行的话,我们可以轻而易举的用ctrl c 终止程序。
程序在终端运行起来后,打开另外一个终端,输入如下命令 获取badpro的进程号PID:
ps aux | grep badpro #ps用于获取进程的详细信息,如:ps -p 1234 获取PID为1234的进程的详细信息;aux 用于查看系统当前所有进程; ps aux 可以罗列出所有进程的详细信息,将这些信息通过管道|输送给grep,grep badpro将从所有进程信息中选出为badpro的进行信息,如下:
从上可以看出badpro的进程号为12974,我们可以利用kill命令来结束badpro进程:
kill 12974
在终结进程badpro后,要记得回到badpro运行的那个终端,将生成的文件夹 以及 文件 删除:
rm -r adir
Linux是一种多用户,多进程的操作系统。在Linux内核中维护着一张表,这张表记录着Linux系统中所有用户进程和系统进程的信息,这些信息包括:
进程的内存地址;
进程当前的状态;
进程的优先级;
进程的属主;
Linux系统提供了让用户监视和控制进程的一种工具。
Linux进程有一系列属性,这些属性决定着进程被处理的优先级,以及其能够享用何种资源,下面简单介绍几种常用的进程属性:
ps是常用的监视进程的命令,可以一次性给出当前系统中所有进程信息的快照,但是这样的信息往往缺乏时效性。当管理员需要实时监视进程运行情况时,就需要不停的运行ps命令,这种操作缺乏效率。
关于ps,常用命令为以下2个:
ps aux #用于显示当前系统上,所有的进程信息,下面展示了部分显示内容,以及各个字段含义:
ps lax #显示进程的父进程ID PID 和 其谦让度 NI,与ps aux不同,ps lax不会显示进程属主的用户名,因此,可以提供更快的运行速度(ps aux 需要先将UID 转为 用户名,之后才会显示,因此,在运行速度上 不如 ps lax)
ps是常用的监视进程的命令,可以一次性给出当前系统中所有进程信息的快照,但是这样的信息往往缺乏时效性。当管理员需要实时监视进程运行情况时,就需要不停的运行ps命令,这种操作缺乏效率。为了提升监控效率,Linux系统给出了top命令。
使用top命令,显示的进程信息 会 默认 每10秒 更新一次,那些使用CPU最多的进程会排在最前面,此外,用户还可以查看每个进程的CPU占比,内存占比 等 信息。
top
lsof 命令可以列出当前系统中,所有打开(占用)文件的 进程信息。
lsof 文档名,能够列出使用 该文档的 所有进程 的 信息。
lsof database.doc
kill命令并不总是用来“杀死进程的”,它的确切含义是 向某一个程序 发送信息,根据其发送信息的不同,系统执行结果也不一样。
对于kill发出的大部分signal,程序都能够捕捉的到,据此,程序可以选择 “忽略/封锁” 该信号,即 不对signal做出任何相应。
但是,对于kill发出的KILL信号,程序无法捕捉,即 系统会强行执行KILL信号(也即 杀死该进程),对于 KILL 信号 都无法杀死的程序,其多半是由于 退化的I/O(输入/输出)虚假锁定造成的,此时,重新启动系统是杀死该进程的唯一办法。
使用 kill -l 可以列出kill所拥有的signals 及其编号(根据硬件结构的不同,signals会有所不同):
kill -l
上表中的signals,绝大部分不会被使用,下表为一些常用的signals:
注意,信号的前缀SIG可以省略,也即 SIGEXIT 等同于 EXIT。
以TERM为例,在默认情况下,kill向程序发出TERM信号,程序会终止:
kill -TERM 12974
但是,如前所述,程序能够捕捉 signal,从而忽略 kill 发送的信息,bc 为一个 命令行程序,但我们在终端中执行bc后,然后 CTRL+C(也即 kill命令 向程序发送 TERM 信号),正常情况下,程序应该终止,但是bc能够捕捉该信号,并返回自己的应对“use quit to exit"。
如果你也想让程序忽略 kill发送的信号,那么只要在程序首行加入 trap “” 信号名,下面的例子中,由于 在程序首航加入 trap “” TERM,因此,该程序会忽略kill发出的TERM信号:
#! /bin/bash
trap "" TERM
while echo "I'm making files!!"
do
makedir adir
cd adir
touch afile
sleep 2s
done
如果你想要杀死该进程,则必须使用kill -KILL PID:
sudo kill -KILL pid
#等同于
sudo kill -SIGKILL pid
#等同于
sudo kill -9 pid
nice可以在启动程序时,设置其谦让度,高谦让度等于低优先级,这意味着其仅能占用很少的CPU时间。程序谦让度的值限定在 -20 到 19 之间。程序的属主,通过nice命令,只能调高谦让度,而不能降低谦让度,如果想要降低程序的谦让度,则必须以root用户来执行nice命令。子进程 会 继承 父进程的谦让度,同样的,子进程也仅能调高其谦让度,如若想降低其谦让度,则必须以root用户来执行nice命令。
renice可以在进程运行时,调整其谦让度值。
#nice命令通过 参数 -n 来设置进程的谦让度
nice -n 2 bc #将程序bc的谦让度设置为2
ps lax #给出系统中进程的详细信息,NI表示进程的谦让度
sudo nice -n -3 bc #如果想要降低bc的谦让度,则需要通过root用户(sudo)来进行
ps lax #通过该命令,查看bc的谦让度
#######################################################################################
#nice命令不带参数时,表示 将程序的谦让度增量设为10;
#通常,程序的默认谦让度值为0,可以通过不带任何参数的nice命令查看程序的默认谦让度
nice
#输出为:0,表示程序的默认谦让度
nice bc #将bc的谦让度增量设为10 ,此时,bc的NI为10
ps lax #通过该命令,查看bc的PID,为:8576
#区别于nice命令,renice命令用于设置程序的绝对谦让度,其可以在进程运行时调整其谦让度值,其语法如下:
renice 12 -p 8576 #-p 表示程序的PID,通过该命令,将bc的谦让度从10变为了12;
/PROC目录中存放着内核有关系统状态的各种有意义的信息。当系统处于运行状态时,内核会随时向/PROC目录写入数据。ps和top命令就是从这个地方读取数据的,可以说,/PROC是操作系统向用户提供的一条通往内核的通道,用户甚至可以通过向/PROC中写入数据而修改操作系统的相关参数,以下是/PROC中的部分文件概览:那些以数字命令的目录存放着以该数字为PID的进程信息。
ps命令就是通过读取 stat 文件 来向用户提供 当前系统的进程状态信息的 。
note that:/PROC文件系统在系统开发中有者广泛引用,有意者可加深学习。