Linux常用命令小抄

linux下java项目在后台启动的几种方式

启动java程序
 
(1)直接启动,控制台退出则关掉应用
 
    java -jar uap-register-server-1.0.0.jar
 
(2)后台启动,控制台退出不会关掉应用
 
    nohup  java -jar uap-register-server-1.0.0.jar &
 
(3)后台启动并且输出日志,控制台退出不会关掉应用
 
    nohup  java -jar uap-register-server-1.0.0.jar >> ./register.log 2>&1 &
(3)后台启动(加内存)并且输出日志,控制台退出不会关掉应用
 
    nohup java -jar -Xms1024m -Xmx2048m uap-register-server-1.0.0.jar>> ./register.log 2>&1 &
关闭程序
    
 (1)查询java应用程序
 
    ps -ef|grep java
 
 (2)强制杀掉进程
 
    kill -9 xxx

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

1 前言

我们在开发 Java Web 服务时,如果使用外部 Tomcat Web容器,那么启停服务可以直接使用 Tomcat 自带的脚本。不过现在大多数服务使用 Spring Boot 框架来开发,使用内嵌的 Tomcat / Jetty Web 容器,所以这时我们一般使用特定的命令或者编写脚本来启停 Web 服务。

我们开发的 Web 服务一般部署在 Linux 服务器上,以下操作基于 Linux 服务器。如果要停止在运行中的 Java 服务,一般会使用两步骤。

首先找出 Java 服务的进程 ID,可以使用 JDK 自带的jps命令或者 Linux 平台的ps(process status) 命令。

[root@chenpihost ~]# jps
8141 jar
8207 Jps
[root@chenpihost ~]# jps -l
8141 chenpi-kill-demo-2.6.7.jar
8223 sun.tools.jps.Jps
[root@chenpihost ~]# 

[root@chenpihost ~]# ps -ef  | grep java
root       8141   7379 34 12:55 pts/0    00:00:42 java -jar chenpi-kill-demo-2.6.7.jar
root       8242   8092  0 12:57 pts/1    00:00:00 grep --color=auto java
1234567891011

然后向 Java 进程发送信号,告知其停止服务,例如使用 Linux kill 命令杀死特定的进程。

[root@chenpihost ~]# kill 8141
1

如果使用 Linux Shell 脚本启停 Java 服务,会用到 kill 这个命令,下面来了解此命令的用法以及开发中需要注意的事项。

2 kill 命令

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

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

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

[root@chenpihost ~]# kill
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
12

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

  • sigspec:信号声明
  • signum:信号编号

那么信号声明和信号编号有哪些呢?可以使用kill -l命令查看,如下所示:

[root@chenpihost ~]# 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
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
1234567891011121314

Linux 信号量(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
12345

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

# 两种等效
kill 1755
kill -15 1755
123

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

# 1755 是进程ID
kill 1755
12