专栏首页苦逼的码农三分钟基础:杀死进程的N种姿势你知道吗

三分钟基础:杀死进程的N种姿势你知道吗

来源:公众号【编程珠玑】

作者:守望先生

你是如何终止你的程序的?在《killall为什么找不到你的进程》一文中提到了几个杀死进程的方法,本文来总结一下有哪些方法可以终止进程。

ctrl+c

没错,这应该是你最常用到的方法了,当前终端非后台运行一个程序后,使用ctrl+c 即可终止当前程序。

ctrl+z

这种方式不算完全终止,更像是暂停,因为它可以通过fg或者bg继续执行。 举个例子,代码如下:

//test.c
//来源:公众号【编程珠玑】
#include<stdio.h>
int main(void)
{
    int i = 0;
    for(i = 0;i < 100;i++)
    {
        printf("%d\n",i);
        sleep(1);
    }
    return 0;
}

编译运行到一定程序后,按下ctrl+z:

$ gcc -o test test.c
$ ./test
0
1
2
^Z
[1]+  Stopped                 ./hello
root@ubuntu16:c$ fg
./hello
3
4
5
root@ubuntu16:c$ 

在ctrl+z之后,再输入fg或者bg,你会发现它接着上次的地方继续运行。

kill

这是最常见也是最常用的了,虽然它名为kill,但实际上它可以给进程发送各种类型的信号,其中信号9就是比较常用的,即用来终止进程。

$ kill -9 pid

kill用于给进程发信号,上面的命令表示给进程id为pid的程序发送9信号。 常见信号如下:

  • HUP 1 终端断线
  • INT 2 中断(同 Ctrl + C)
  • QUIT 3 退出(同 Ctrl + \)
  • TERM 15 终止
  • KILL 9 强制终止
  • CONT 18 继续(与STOP相反, fg/bg命令)

可以看到信号KILL就是强制终止程序。

你也可以通过这样来查看这些数字的意义:

$ kill -l 9
KILL
$ kill -l
 1) SIGHUP     2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT     7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV    12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

killall

killall进程杀死进程,它在某些情况下会失效,具体可以参考《killall为什么找不到你的进程》 它还支持杀死一定时间的进程,例如杀死运行超过30分钟的hello进程:

$ killall -o 30m hello

其中-o表示older-than,当然你还可以用-y,表示yonger-than。 m表示分钟,还有其他的时间刻度:

  • s 秒
  • m 分钟
  • h 小时
  • d 天
  • w 周
  • M 月
  • y 年

它除了可以根据名字还可以根据正则表达式来杀死进程。使用-r参数即可。

pkill

pkill也可以根据进程名杀死进程,它和killall有点类似。

$ pkill hello

由于你可能起了多个hello程序,所以为了杀死最旧的进程,你可以这样做:

$ pkill -o hello #oldest

或者杀死最新的进程:

$ pkill -n hello #newest

或者计算运行的hello程序的数量:

$ pkill -c hello

如何查找进程id

上面提到的有些命令需要根据pid进行操作,如何获取pid呢?也有几种常见的方法。

ps

这是最常见的的了,可以参考《ps命令实例详解

pidof

pidof可以直接获取某个进程的进程id,也比较准确:

$ pidof hello
7584

结合kill可以这样用:

$ kill -9 `pidof hello`

是不是一气呵成?

pgrep

它同样可以通过名字直接获取到进程id:

$ pgrep hello
19971
24770

top

top 的结果中也可以看到各个进程的进程id。

总结

本文仅对一些常见终止进程方式进行简单介绍,更多用法可以参考对应手册。 但是这些操作都有着同样的本质,那就是给进程发送信号,而进程通常对这个信号的处理是终止程序或者被迫终止。所以如果你想要实现优雅退出,可以试着给进程发特定信号,在收到该信号后,进程做善后处理,然后退出。

本文分享自微信公众号 - 苦逼的码农(di201805)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算机是如何启动的?

    我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示…… 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。

    帅地
  • 从零打卡leetcode之day 2--两数相加

    我靠,居然还用到了链表的知识,突然就想起了当初用c语言自学链表的那段日子,真的差点被搞死。各种指针指来指去的。

    帅地
  • Linux中为什么执行自己的程序要在前面加./

    在说明清楚问题之前,我们必须了解shell是如何运行程序的。首先我们必须要清楚的是,执行一条Linux命令,本质是在运行一个程序,如执行ls命令,它执行的是ls...

    帅地
  • 杀死进程的N种姿势你知道吗

    你是如何终止你的程序的?在《killall为什么找不到你的进程》一文中提到了几个杀死进程的方法,本文来总结一下有哪些方法可以终止进程。

    编程珠玑
  • logstash配置codec插件-JSON模式

    配置nginx日志 log_format json '{"remote_addr":"$remote_addr" ,"host":"$host" ,"serve...

    苦咖啡
  • 大牛书单 | 腾讯技术大咖推荐你春节看这些书

    ? 导语:读书,伴随技术人的一生。技术人通过读书增长见闻、精进技术,提升人生境界。20年农历春节,我们特别邀请几位重量级鹅厂技术大牛分别推荐曾经读过的好书佳作...

    腾讯技术工程官方号
  • 视觉抗疫情 | AI无感测温技术解密

    当前的环境下,出门测体温已经是预防疫情有效手段之一,传统的测温方法就是测温枪,它的缺点就是近距离、手持式的,在大规模或者大流量的人群中使用,容易导致人群聚集排队...

    OpenCV学堂
  • 视觉抗疫情 | AI无感测温技术解密

    点击上方“小白学视觉”,选择“星标”公众号 以下文章来源于OpenCV学堂,作者gloomyfish

    小白学视觉
  • 必读 | 大规模使用 Apache Kafka 的20个最佳实践

    Apache Kafka是一款流行的分布式数据流平台,它已经广泛地被诸如New Relic(数据智能平台)、Uber、Square(移动支付公司)等大型公司用来...

    用户1516716
  • 进程控制概念简介 多线程上篇(三)

    进程的基本数据信息是操作系统控制管理进程的数据集合,这些信息就是用来控制进程的,此处我们说的进程控制就是进程的管理。

    noteless

扫码关注云+社区

领取腾讯云代金券