首先使用 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 命令的用法以及开发中需要注意的事项。
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
-
SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
-
SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
-
SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
-
SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
-
SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
-
SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
-
SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
-
SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
-
SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
-
SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
-
SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
-
SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
-
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
那我们该如何使用 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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!