Linux如何从命令行卡死的进程中退出?
不知道大家在使用Linux的时候,会不会遇到一些命令,有可能卡顿,有可能执行时间过长(比如使用 find 查找某个文件),这个时候我不想继续执行这个命令了,说来惭愧,我之前一直使用Ctrl+Z
去终止这个命令,今天才知道,这样有很大的问题!
信号简介
一个进程在运行的时候,是能够接受内核发送的信号的,并且对这个信号做出自己的默认行为(没有被修改的话),我列举一下常见的信号列表:
先看一下信号9,我们熟知的kill -9 <进程号>
,就是让内核发送给进程终止信号,进程接收以后才能终止。
同理,我们也可以使用键盘发送信号 ,Ctrl + Z
发送的信号只是挂起这个进程,Ctrl + C
才是终止。这意味着,使用Ctrl + Z
从终端退出的进程,并没有被释放!
实验
接下来通过两个实验,看看Ctrl + Z
(挂起)和Ctrl + C
(停止)的区别。
find 查找文件
我们使用find
命令从home目录查找某个文件,然后分别使用Ctrl + Z
(挂起)和Ctrl + C
(停止),看看他们的区别。
-
Ctrl + Z
运行find命令后,使用ctrl +Z 退出
此时使用
ps -t
显示当前正在运行的进程的信息:
可以发现进程还存在着。
-
Ctrl + C
运行find命令后,使用ctrl +C
此时可以发现进程被彻底关闭了。
其实这种情况还是好的一种情况,因为本质上shell终端也是一个进程,在shell终端里使用命令,相当于创建终端的子进程,当终端(父进程)被关闭时,其子进程也会被关闭(大部分时候)。对于上面的情况,当我们关闭shell命令行时,find进程也会被关闭。
但是,这也只是大部分情况,也可能有一些子进程即使在父进程被关闭之后也不会被关闭,而是一直被挂起!
端口占用
在系统开启一个进程,这个进程会监听某个端口:
-
Ctrl + Z
在这之后,即使关闭终端,56868进程也没有被释放。
上图是在一个新的终端里使用sudo lsof -i :801
查看端口的占用,发现这个进程并没有被释放,因此需 要使用kiil -9 56868
释放进程。
-
Ctrl + C
进程被释放,端口也被释放。
所以大家如果不打算继续使用这个被退出的进程,记得使用Ctrl + C
退出哦。