Linux如何从命令行卡死的进程中退出?

Linux如何从命令行卡死的进程中退出?

不知道大家在使用Linux的时候,会不会遇到一些命令,有可能卡顿,有可能执行时间过长(比如使用 find 查找某个文件),这个时候我不想继续执行这个命令了,说来惭愧,我之前一直使用Ctrl+Z去终止这个命令,今天才知道,这样有很大的问题!

信号简介

一个进程在运行的时候,是能够接受内核发送的信号的,并且对这个信号做出自己的默认行为(没有被修改的话),我列举一下常见的信号列表:

image-20240129105103106先看一下信号9,我们熟知的kill -9 <进程号>,就是让内核发送给进程终止信号,进程接收以后就会终止。

同理,我们也可以使用键盘发送信号 ,Ctrl + Z发送的信号只是挂起这个进程,Ctrl + C才是终止。这意味着,使用Ctrl + Z从终端退出的进程,并没有被释放

实验

接下来通过两个实验,看看Ctrl + Z(挂起)和Ctrl + C(停止)的区别。

find 查找文件

我们使用find命令从home目录查找某个文件,然后分别使用Ctrl + Z(挂起)和Ctrl + C(停止),看看他们的区别。

  1. Ctrl + Z

    运行find命令后,使用ctrl +Z 退出

    image-20240129153604841

    此时使用ps -t显示当前正在运行的进程的信息:

    image-20240129154016839

​ 可以发现进程还存在着。

  1. Ctrl + C

    运行find命令后,使用ctrl +C

    image-20240129154308428

    此时可以发现进程被彻底关闭了。

其实这种情况还是好的一种情况,因为本质上shell终端也是一个进程,在shell终端里使用命令,相当于创建终端的子进程,当终端(父进程)被关闭时,其子进程也会被关闭(大部分时候)。对于上面的情况,当我们关闭shell命令行时,find进程也会被关闭。

但是,这也只是大部分情况,也可能有一些子进程即使在父进程被关闭之后也不会被关闭,而是一直被挂起!

端口占用

在系统开启一个进程,这个进程会监听某个端口:

image-20240129155119994

  1. Ctrl + Z

    在这之后,即使关闭终端,56868进程也没有被释放。

    image-20240129155536643

​ 上图是在一个新的终端里使用sudo lsof -i :801查看端口的占用,发现这个进程并没有被释放,因此需 要使用kiil -9 56868释放进程。

  1. Ctrl + C

    image-20240129160036827

​ 进程被释放,端口也被释放。

所以大家如果不打算继续使用这个被退出的进程,记得使用Ctrl + C退出哦。

更多与Linux信号相关的知识,感兴趣的可以移步:https://www.cnblogs.com/curiositywang/p/17994774

posted @ 2024-01-29 16:07  CuriosityWang  阅读(98)  评论(0编辑  收藏  举报