Linux 环境如何使用 kill 命令优雅停止 Java 服务

本文介绍了如何使用JDK的jps命令查找服务进程ID,随后详细解释了Linuxkill命令的用法,包括其信号发送功能,以及在开发中特别提到的使用kill命令终止SpringBoot服务的场景,强调了优雅停止服务的重要性。
摘要由CSDN通过智能技术生成

首先使用 JDK 自带的 jps 命令或者 Linux ps(process status) 命令来查出服务进程 ID。

[root@chenpi ~]# jps

1618 Jps

1573 jar

[root@chenpi ~]# jps -l

1573 kill-demo-1.0.0.jar

1628 sun.tools.jps.Jps

[root@chenpi ~]#

然后使用 linux kill 命令杀死特定的进程。

kill -9 1573

下面我们就来了解这个 kill 命令的用法以及开发中需要注意的事项。

2 kill 命令



kill() 是一个计算机编程语言函数,kill 函数可以向进程发送 signal()。在 Linux 里使用的 kill 命令,实际上是对 kill() 函数的一个包装。-- 来自百度百科的对 kill 命令的介绍。

简而言之,Linux kill 命令可以将指定的信号发送至程序,将指定程序终止。

查看 kill 命令的使用语法,直接在 Linux 服务上执行 kill 命令即可查看。

[root@chenpi ~]# kill

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec … or kill -l [sigspec]

对于可选参数 -s sigspec | -n signum | -sigspec,说明如下:

  • sigspec:信号声明

  • signum:信号编号

那么信号声明和信号编号有哪些呢?可以使用 kill -l 命令查看。

[root@chenpi ~]# kill -l

  1. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP

  2. SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1

  3. SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

  4. SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

  5. SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

  6. SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR

  7. SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3

  8. SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

  9. SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

  10. SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

  11. SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7

  12. SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

  13. SIGRTMAX-1 64) SIGRTMAX

Linux Signals 的信号声明和信号编号相应关系以及解释如下表格。

| Signal Name | Number | Description |

| :-- | — | — |

| SIGHUP | 1 | Hangup (POSIX) |

| SIGINT | 2 | Terminal interrupt (ANSI) |

| SIGQUIT | 3 | Terminal quit (POSIX) |

| SIGILL | 4 | Illegal instruction (ANSI) |

| SIGTRAP | 5 | Trace trap (POSIX) |

| SIGIOT | 6 | IOT Trap (4.2 BSD) |

| SIGBUS | 7 | BUS error (4.2 BSD) |

| SIGFPE | 8 | Floating point exception (ANSI) |

| SIGKILL | 9 | Kill(can’t be caught or ignored) (POSIX) |

| SIGUSR1 | 10 | User defined signal 1 (POSIX) |

| SIGSEGV | 11 | Invalid memory segment access (ANSI) |

| SIGUSR2 | 12 | User defined signal 2 (POSIX) |

| SIGPIPE | 13 | Write on a pipe with no reader, Broken pipe (POSIX) |

| SIGALRM | 14 | Alarm clock (POSIX) |

| SIGTERM | 15 | Termination (ANSI) |

| SIGSTKFLT | 16 | Stack fault |

| SIGCHLD | 17 | Child process has stopped or exited, changed (POSIX) |

| SIGCONT | 18 | Continue executing, if stopped (POSIX) |

| SIGSTOP | 19 | Stop executing(can’t be caught or ignored) (POSIX) |

| SIGTSTP | 20 | Terminal stop signal (POSIX) |

| SIGTTIN | 21 | Background process trying to read, from TTY (POSIX) |

| SIGTTOU | 22 | Background process trying to write, to TTY (POSIX) |

| SIGURG | 23 | Urgent condition on socket (4.2 BSD) |

| SIGXCPU | 24 | CPU limit exceeded (4.2 BSD) |

| SIGXFSZ | 25 | File size limit exceeded (4.2 BSD) |

| SIGVTALRM | 26 | Virtual alarm clock (4.2 BSD) |

| SIGPROF | 27 | Profiling alarm clock (4.2 BSD) |

| SIGWINCH | 28 | Window size change (4.3 BSD, Sun) |

| SIGIO | 29 | I/O now possible (4.2 BSD) |

| SIGPWR | 30 | Power failure restart (System V) |

每一个信号量都有对应的信号声明和信号编号,比如 9) SIGKILL ,那么我们可以使用下面任何一种命令来强制终止进程(假设进程 ID 为1760)。因为信号声明前缀都是 SIG ,所以也可以省略前缀。

kill -9 1760

kill -n 9 1760

kill -s SIGKILL 1760

kill -SIGKILL 1760

kill -KILL 1760

如果没有显示指定具体的信号,默认是 15) SIGTERM。当程序接收到此信号后,程序会做停止前的处理工作,例如释放相应的资源,然后再停止,但是程序有可能会继续运行着。即 SIGTERM 信号是可以被阻塞的,可能被忽略的。

两种等效

kill 1755

kill -15 1755

使用 kill 命令终止一个进程,后面需要跟参数 pid | jobspec ...,可以是程序的 PID,PGID,或者工作编号等。

1755 是进程ID

kill 1755

3 应用



那我们该如何使用 kill 命令来停止服务呢?有些人说直接使用 kill -9 PID,其实这个是很粗暴的而且极其危险的动作。因为它不管程序现在有没有未处理完的事情,直接强制终止进程,这对于一些比较敏感的服务,例如金融交易等业务是致命的。

例如,我们在 Springboot 服务启动后增加个 ShutdownHook,服务正常关闭情况下,会调用执行这个钩子函数。

package com.chenpi;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class KillDemoApplication {

public static void main(String[] args) {

SpringApplication.run(KillDemoApplication.class, args);

Runtime.getRuntime().addShutdownHook(new Thread(() -> {

System.out.println(“我是陈皮的进程,我快要挂了,我要说点遗言…”);

}));

}

}

启动服务后,我们直接使用 kill -9 PID 命令杀死进程。发现控制台只打印一句 Killed 字样,服务直接被强制终止了。

在这里插入图片描述

如果我们使用 kill PID 命令停止服务,发现关机钩子函数被正常执行了,实现了优雅停止服务。而且你也会发现线程池也执行了关闭操作,实现了在停止服务前执行完线程池的任务,释放资源等操作。

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值