top命令可以显示现在各个运行程序的CPU与内存使用情况。可以手动让命令行中运行的命令休眠,也可以使用fg命令使其重新工作,如图2-6所示。
图2-6
有时你会觉得正在运行的程序卡住了,不响应你的输入,包括退出键Q。这时,好像只有Ctrl+C可以关闭它。这一节处理“死机”问题,你完全不需要重启,就可以通过一些命令很简单地将对应的进程在后台关闭。
你可以通过ps命令查看系统上运行的进程。ax选项可以显示所有用户的所有进程,u选项可以指定显示某一名用户的进程;w和ww可以针对输出的格式进行设定。
可以亲手试一试ps auxww以及其他的一些组合。你会发现这里命令的可选项前面没有加“-”,这是因为这个命令是从早期UNIX的ps一直延续下来的。也有一些UNIX的其他分支对ps命令做了改进,所以你可能会看到ps -e这样的命令。
ps aux返回的列表有很多项,包括用户名、PID等,其中第一个进程init对应的PID是1。
接下来要学习的kill命令与PID有关。如果你想要杀掉一个程序,并且知道它的PID是3012,那么只需要输入“kill 3012”即可。想要快速找到一个程序的PID,比如说vi工具的PID,输入
$ ps aux | grep -i vi
一般来说,-i选项不是必需的,但是加上它可以确保你免受大小写问题的干扰。killall命令加上程序名比如说killall firefox也可以关闭一个进程。
现在来看一个稍微复杂点的示例:
kill $(ps aux | grep '[f]irefox' | awk '{print $2}')
先来谈一谈awk。这里不会深入介绍它,你只需要知道它只是用来打印输出的第二列,也就是PID;除此以外,[f]这个小技巧可以防止grep进程自己被包括进输出信息。
ps命令的输出还会告诉你一些有用的信息,比如内存和CPU的使用率。除了ps以外,top命令可以显示实时变动的硬件使用情况;free命令也有类似的功能,可以显示可用的内存等信息;htop是一个加强版的top,可以通过apt安装使用:
$ sudo apt-get install htop
当然现在的Raspbian系统中已经内置了htop命令。
你可以使用鼠标滚轮上、下、左、右拖动htop输出的信息,甚至可以直接在这个界面使用k指令关闭某些进程。与top指令相同,你可以使用Q键来退出这个界面。在多核处理器上,htop还会显示每一个核心的占用率,如图2-7所示。
图2-7
htop不仅能够显示进程及其对应的占用率,还能够让你与它互动。
在一条命令后加上&符号可以让其在后台运行。尝试man top &,你会得到类似的输出[1] 12768。其中,第一个数字是任务号,由终端自动分配;第二个数字是PID。现在man top已经在后台运行了,你可以通过任务号在命令行里与后台任务进行交互。尝试在后台打开另一个任务,然后输入fg 1,你会看到man指令再一次运行起来了。
对于一个任务,你可以使用Ctrl+Z来将它挂起。不加参数的fg命令总是会执行最近一个被挂起的任务或者后台任务(注意两者的区别)。刚才分配的任务号只在这一个终端里才是有效的,通过输入jobs可以看到后台运行的任务,jobs -l还可以同时输出这些任务的PID。
nohup会在后台运行一个程序,特别是这个程序在终端退出后还能继续执行。在终端退出后,程序的输出以及报错信息会保存到nohup.out文件(在你运行这个进程的目录下)。这时要讲到之前学过的重定向了。你可以把输出信息重定向到另外的文件,1>是重定向到stdout,2>是重定向到stderr,&>是同时重定向到stdout与stderr:
$ nphup myprog &>backgroundoutput.txt &
nohup常见的一个使用场景与网络连接有关。举例来说,你想要重启一个已经连接成功的网络:
$ sudo nohup sh -c "ifconfig wlan0 down && ifconfig wlan0 up"
注意,输出的nohup.out文件需要sudo权限才可以读写。当然,你也可以自行修改权限:
$ sudo chown pi:pi nohup.out
nohup对那些要长时间在后台运行的程序很有用,比如一个传感器程序。
当我们在htop里杀掉一个进程时,其实是给这个进程发送了一个信号,常见的有SIGTERM、SIGINT以及SIGKILL。
第一个信号就是我们在命令行里输入kill时会发送的。接收到这个信号后,进程会首先保存数据,然后释放系统资源。
SIGINT是kill -2会发送的信号,这与Ctrl+C的效果是一样的,你会丢失掉未存的数据。SIGKILL对应的是kill -9,这个信号会告诉内核在没有任何警告的情况下直接关闭进程,最好不要直接尝试发送SIGKILL信号。
kill -1对应的HUP信号是危险等级最低的,对于很多守护进程来说,这个信号只是让它们进行一轮自检。在一些容错率很低的机器上,kill -1是你应该优先考虑的选择。