SlideShare une entreprise Scribd logo
1  sur  105
Shell,信号量与Java进程的退出
错刀 2017-3-11
http://hongjiang.info
问题
Java 怎么实现一个常驻的服务?
第一个例子
• public class Daemon {
• public static void main(String[] args) {
• new Thread() {
• public void run() {
• while (true) {
• try {
• // doSomething(); 该线程周期性的做一些事
情
• Thread.sleep(2000);
• } catch (Exception e) {
• }
• }
• }
• }.start();
• }
• }
现在把程序部署到服务器上
• ssh 到某台 linux 环境
• $ java Daemon &
然后你合上笔记本,准备愉快的回家了
在你刚走到电梯的时候,收到了报警
Who killed java ?
问题
• 谁创建的Java进程?
– 它的父进程是谁? 它会继承父进程什么?
• 谁杀死了Java进程?
– 通过什么方式?
Unix下进程的特性
进程皆有父
进程皆有名
进程皆可衍生
进程皆有资源限制
进程可能会死
进程皆有退出码
进程皆有可获得信号
信号是通过什么命令发送?
Kill
注意在大多数shell 下它同时也是一个内置命令
$ echo $0 && type -a kill
-bash
kill is a shell builtin
kill is /usr/bin/kill
➜ echo $0 && type -a kill
zsh
kill is a shell builtin
kill is /bin/kill
% echo $0 && type -a kill
csh
kill is a shell builtin
kill is /bin/kill
Kill
SIGHUP, SIGQUIT, SIGINT, SIGTERM, SIGSTOP, SIGKILL
字面上都有停止的意思,它们的区别是什么?
常见Signal以及JVM处理方式
SIGHUP
JVM如何处理 SIGHUP ?
$ kill -1 `pgrep java`
守护进程对SIGHUP的处理
$ kill –s HUP pidof_nginx
“This signal [SIGHUP] is commonly used to notify
daemon processes (Chapter 13) to reread their
configuration files. The reason SIGHUP is chosen for
this is because a daemon should not have a
controlling terminal and would normally never
receive this signal.”
<<Advanced Programming in the UNIX Environment>>
SIGINT (ctrl-c)
JVM如何处理 SIGINT?
$ kill -2 `pgrep java`
SIGQUIT (ctrl-)
JVM如何处理SIGQUIT?
$ kill -3 `pgrep java`
跟 jstack 类似,额外多了一点信息
SIGQUIT 并不会让JVM产生coredump,
如何才能产生?
JVM如何产生coredump?
第一种方式,发送 SIGILL 或 SIGBUG 信号,jvm crash前会产生coredump
# 启动java前需要去掉限制
$ ulimit -c unlimited
$ java Daemon
# 发送 SIGILL 或 SIGBUS 信号给目标 java 进程
$ kill –s ILL `pgrep java` 等同于 kill -4
或
$ kill –s BUS `pgrep java` 等同于 kill -7 (Mac下等同于 kill -10)
# 产生的coredunp 文件可在 hs_err_pidxxx.log里查找
$ grep 'Core dump' hs_err_pid37418.log
Core dump written. Default location: /cores/core or core.37418
# 如果目标进程没有unlimited 可能会无法生成 coredump 文件
JVM如何产生coredump?
第二种方式,通过gdb来产生coredump, jvm不会crash
# 使用 gdb attach 到目标进程
$ sudo gdb --pid=19936
...
(gdb) gcore /tmp/jvm.core
warning: target file /proc/19936/cmdline contained unexpected null characters
Saved corefile /tmp/jvm.core
(gdb) detach
(gdb) quit
#coredump文件可以作为源,再进行heapdump,比直接用 jmap对目标进程 heapdump更快
$ jmap -dump:format=b,file=jvm.hprof /usr/bin/java /tmp/jvm.core
SIGSTOP & SIGCONT
SIGSTOP
scala> var a=0;
scala> while(true) { Thread.sleep(2000); println(a); a=a+1 }
0
1
2
$ ps -ostat -p `pidof java`
STAT
S+
$ kill -s stop `pidof java`
此时jvm进程被暂停住,进程状态也变为: T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态
$ ps -ostat -p `pidof java`
STAT
T+
SIGCONT
$ kill -s cont `pidof java`
$ ps -ostat -p `pidof java`
STAT
S+
java进程恢复运行状态,继续循环输出
SIGUSR1 & SIGUSR2
SIGUSR1
$ kill –s USR1 pidof_nginx
Logrotate
$ kill –s USR1 pidof_java
Jvm 退出
$ kill –s USR2 pidof_java
被识别为 SIGSEGV, Jvm Crash (Coredump)
SIGPIPE
SIGPIPE
• Java Socket connection reset 异常与 SIGPIPE
的关系?
Broken Pipe
Broken pipe
FIN_WAIT_2
Connection Reset
SIGTERM
JVM如何处理SIGTERM
$ kill `pgrep java`
临终遗言或垂死挣扎:
ShutdownHook
ShutdownHook
scala> Runtime.getRuntime.addShutdownHook(
new Thread(new Runnable {
def run () {
println("shutdown");
Thread.sleep(10000);
println("END");
}
}))
自行了断
• OOM Fail-fast
-XX:OnOutOfMemoryError="kill -9 %p"
• Akka
jvm-exit-on-fatal-error = on
SIGKILL
SIGKILL
• ShutdownHook 将不会被执行
• 什么情况下 kill -9 也无法结束一个进程?
SIGKILL
• 内核什么情况下会发给Java进程SIGKILL?
• oom-Killer
• cpu time limit
SIGKILL
$ ulimit -t 10
$ scala
scala> while(true){}
# 在另一个终端监听 java收到的signal
$ sudo strace -e trace=signal -p 27708
Process 27708 attached
+++ killed by SIGKILL +++
改变 Signal 的处理行为:
自定义 Signal Handler
JVM Signal Handler
scala> import sun.misc._
scala> Signal.handle(new Signal("INT"),
| new SignalHandler(){
| def handle(sig:Signal){ println("down") }}
| )
$ kill -s INT `pidof java`
scala> down // 被捕获,进程不会退出
JVM Signal Handler
注意,被OS或JVM已注册了的 Signal 不能被修改,比如 SIGQUIT、
SIGUSR1 等
scala> Signal.handle(
| new Signal("QUIT"),
| new SignalHandler(){
| def handle(sig:Signal){ println("down") }
| }
| )
java.lang.IllegalArgumentException: Signal already used by VM or OS:
SIGQUIT
at sun.misc.Signal.handle(Signal.java:166)
... 38 elided
忽略系统的signal
JVM -Xrs参数(reduce signal)
$ scala -J-Xrs
$ kill -3 `pidof java`
这个时候确实不会产生 thread dump,
并且java进程会退出。
signal dispatcher线程
• http://hllvm.group.iteye.com/group/topic/39
570
• http://ifeve.com/jvm-attach/
Shell:一个特殊的进程
Shell的几种模式
• login shell
• non-login shell
• interactive shell
• non-interactive shell
非交互式shell
• 以脚本方式运行
• 运行时不会显式加载用户profile/rc
交互式shell
交互式shell
• 加载用户 profile/rc
– 自行google bash 启动时加载哪些文件
– 作为 login-shell 和 non-login-shell 时有什么不同
前台任务与后台任务
• Foreground process
– 运行时阻塞shell
• Background process
– 运行时不阻塞shell
后台任务
#!/bin/bash
sleep 5 & # 模拟并行任务1
pid1=$!
sleep 5 & # 模拟并行任务2
pid2=$!
sleep 5 & # 模拟并行任务3
pid3=$!
wait $pid1 $pid2 $pid3 && echo "all done"
作业控制
作业控制是指有选择的停止(暂停)并在后来
继续(恢复)执行某个进程的能力。
交互式shell默认开启作业控制
非交互式shell默认关闭作业控制
交互式shell下的作业控制
交互式shell下的作业控制
$ vim
# 在 vim 下执行 ctrl-z
# vim 收到 SIGTSTP 信号,进程暂停并被移到后台
$ jobs
[1] + suspended vim
$ fg %1
# vim 收到 SIGCONT 信号,进程恢复并切换回前台执行
Sigtstp 与 Sigstop 类似,通常 sigtstp 是来自键盘 ( ctrl-z )
交互式shell下的作业控制
关闭作业控制
bash-4.4$ set +m
bash-4.4$ sleep 10 &
[1] 94679
bash-4.4$ fg %1
bash: fg: no job control
进程组
$ echo $$
400
$ find / 2 > /dev/null | wc –l &
[1] 659
$ sort < longlist | uniq -c
PID=400
PPID=399
PGID=400
SID=400
bash
PID=658
PPID=400
PGID=658
SID=400
find
PID=659
PPID=400
PGID=658
SID=400
wc
PID=660
PPID=400
PGID=660
SID=400
sort
PID=661
PPID=400
PGID=660
SID=400
uniq
进程组
400
进程组
658
进程组
660
后台进程组
前台进程组
进程组首进程
session
PID=400
PPID=399
PGID=400
SID=400
bash
PID=658
PPID=400
PGID=658
SID=400
find
PID=659
PPID=400
PGID=658
SID=400
wc
PID=660
PPID=400
PGID=660
SID=400
sort
PID=661
PPID=400
PGID=660
SID=400
uniq
进程组
400
进程组
658
进程组
660
会话400
会话
首进程
Session
• 新进程会继承父进程的会话ID
• 同一会话中的所有进程共享单个控制终端
• 会话中只有一个前台进程组,可有多个后
台进程组
Terminal
Terminal
• 计算机考古
一台大型主机往往需要支持许多用户同时使用,每个用户所
使用操作的设备,就叫做Termial——终端,终端使用通信电
缆与电脑主机连接,甚至可以通过电信网络(电话、电报线
路等等)连接另一个城市的电脑。
图片来源:https://www.zhihu.com/question/21711307
在上图中的那种带显示屏的视频终端出现之前,TTY是最流行的终
端设备
tty: 电传打字机
TeleTYpewriter 是早期的终端(物理设备),它们用于向计算机发送数
据,并将计算机的返回结果打印出来。显示器出现后,终端不再将结
果打印出来,而是显示在显示器上。但是tty的名字还是保留了下来。
终端与控制进程
控制终端的连接建立起来之后(即打开终端),
会话首进程会成为该终端的控制进程。
PID=400
PPID=399
PGID=400
SID=400
bash
PID=658
PPID=400
PGID=658
SID=400
find
PID=659
PPID=400
PGID=658
SID=400
wc
PID=660
PPID=400
PGID=660
SID=400
sort
PID=661
PPID=400
PGID=660
SID=400
uniq
进程组
400
进程组
658
进程组
660
会话
400
共享同一个控制终端 (tty)
控制进程
终端与控制进程
当一个控制进程失去其终端连接之后,内核
会向其发送一个SIGHUP信号。(还会发送一个
SIGCONT信号以确保当该进程之前被一个信号
停止时重新开始该进程),一般发生在两个场
景下:
1) 终端驱动器(调制解调器)连接断开
2) 工作站上的终端窗口被关闭
当shell收到sighup后,它对子进程如何处理?
1) 第一个终端下(bash)执行 sleep 4400
$ sleep 4400
2) 在第二个终端下监听 sleep 4400 进程的 singal
$ ps xf | grep -C2 sleep
24327 pts/2 Ss 0:00 _ -bash
24361 pts/2 S+ 0:00 _ sleep 4400
$ sudo strace -e trace=signal -p 24361
3) 用鼠标关闭第一个终端窗口
SIGHUP的链式反应
SIGHUP的链式反应
bash的子进程也收到 SIGHUP
$ sudo strace -e trace=signal -p 24361
Process 24361 attached
--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL,
si_value={int=1004881496, ptr=0x7f123be54658}} ---
+++ killed by SIGHUP +++
Shell 正常退出对后台进程组的影响
• 取决于具体的shell实现,bash下有个参数设置,
默认在正常退出时不会对后台子进程发送
sighup
• $ shopt huponexit
huponexit off
在bash下通过 exit 或 ctrl-d 退出,其后台进程不
会收到 sighup,但不排除受其它signal影响
回顾最初的例子:
$ java Daemon &
它在交互式shell下启了一个后台任务,终端
断开后(网络断开) shell 收到了 kernel 的
sighup 执行退出,并将 sighup 发送给了它的
子进程,java 进程收到 sighup 后也退出。
如何解决?
• 让后台服务进程忽略sighup是关键
摆脱 SIGHUP
1)nohup
$ nohup java Daemon &
2) disown
$ java Daemon &
$ disown
3) setsid 设置为一个新的 session
$ setsid java Daemon &
摆脱 SIGHUP
另一种惯用的技巧: subshell
孤儿进程
孤儿进程
• 一个父进程退出,而它的一个或多个子进
程还在运行,那么那些子进程将成为孤儿
进程。孤儿进程将被init (或systemd) 进程
(进程号为1)所收养,并由init进程对它们完
成状态收集工作。
摆脱 SIGHUP: subshell
$ ( java Daemon &)
在当前shell下额外起来一个新的subshell作为java的父
进程,等同于在当前shell下执行下面的脚本:
$ cat start.sh
#!/bin/sh
java Daemon &
$ ./start.sh
一个现实中的案例
#!/bin/bash
cd /data/program/tomcat7/bin/
./catalina.sh start
tail -f /data/program/tomcat7/logs/catalina.out
问题
将 catalina.sh start 简化:
#!/bin/sh
eval '"/pathofjdk/bin/java"’ 'params'
org.apache.catalina.startup.Bootstrap start '&’
脚本运行后 java 进程会挂到 pid为1的进程下
进程树
• 用 ctrl-c 终止当前test.sh进程时,系统events
进程向 java 和 tail 两个进程发送了SIGINT 信
号
• SIGINT [ 0 11 ] -> [ 0 20629 tail ]
• SIGINT [ 0 11 ] -> [ 0 20628 java ]
• SIGINT [ 0 11 ] -> [ 0 20615 test.sh ]
• 关闭ssh终端窗口时,sshd向下游进程发送SIGHUP,
为何java进程也会收到?
• SIGHUP [ 0 11681 sshd: hongjiang [priv] ] -> [ 57316
11700 bash ]
• SIGHUP [ 57316 11700 -bash ] -> [ 57316 11700 bash ]
• SIGHUP [ 57316 11700 ] -> [ 0 13299 tail ]
• SIGHUP [ 57316 11700 ] -> [ 0 13298 java ]
• SIGHUP [ 57316 11700 ] -> [ 0 13285 test.sh ]
• 交互模式与非交互模式对作业控制(job
control)默认方式不同
• 交互模式下shell不会对后台进程处理SIGINT
信号设置为忽略,而非交互模式下会设置
为忽略
• 在非交互模式下,shell对java进程设置了
SIGINT,SIGQUIT信号设置了忽略,但并没
有对SIGHUP信号设为忽略。
再看一下当时的进程层级:
|-sshd--sshd--sshd--bash--test.sh--tail
sshd把SIGHUP传递给bash进程后,bash会把
SIGHUP传递给它的子进程,并且对于其子进程
test.sh,bash还会对test.sh的进程组里的成员都
传播一遍SIGHUP。因为java后台进程从父进程
catalina.sh(又是从其父进程test.sh)继承的pgid,
所以java进程仍属于test.sh进程组里的成员,收
到SIGHUP后退出。
Subshell 没有退出导致Java进程没有跟控制进
程(bash)之间有效的脱离关系
这个例子Java进程由2层subshell 来启动,
test.sh以及 catalina.sh 尽管 catalina.sh 启动后
退出,但 test.sh 这层 subshell 被 tail 进程给阻
塞着,控制进程可以将 SIGHUP 发给 test.sh 进
程组
• 一个更复杂的关于作业控制的例子:
http://hongjiang.info/job-control-and-
foreground-process-group/
• 书籍参考:《Linux系统编程手册》
Q&A

Contenu connexe

Tendances

深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)wang hongjiang
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享Chong-Kuan Chen
 
揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharing揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharingYi-Jun Zheng
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Kris Mok
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收Tony Deng
 
shell script introduction
shell script introductionshell script introduction
shell script introductionJie Jin
 
如何学习Bash Shell
如何学习Bash Shell如何学习Bash Shell
如何学习Bash ShellLI Daobing
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops琛琳 饶
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结Yiwei Ma
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应zhaolinjnu
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討國昭 張
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介琛琳 饶
 
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Chu-Siang Lai
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & WindowsChu-Siang Lai
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 
Introduce to Linux command line
Introduce to Linux command lineIntroduce to Linux command line
Introduce to Linux command lineWen Liao
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)Kris Mok
 

Tendances (20)

深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharing揭秘家用路由器Ch10 sharing
揭秘家用路由器Ch10 sharing
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
 
Windbg入门
Windbg入门Windbg入门
Windbg入门
 
shell script introduction
shell script introductionshell script introduction
shell script introduction
 
如何学习Bash Shell
如何学习Bash Shell如何学习Bash Shell
如何学习Bash Shell
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结
 
Mysql展示功能与源码对应
Mysql展示功能与源码对应Mysql展示功能与源码对应
Mysql展示功能与源码对应
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
DNS协议与应用简介
DNS协议与应用简介DNS协议与应用简介
DNS协议与应用简介
 
Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)Automate with Ansible basic (3/e)
Automate with Ansible basic (3/e)
 
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
現代 IT 人一定要知道的 Ansible 自動化組態技巧 Ⅱ - Roles & Windows
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
Introduce to Linux command line
Introduce to Linux command lineIntroduce to Linux command line
Introduce to Linux command line
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
 

En vedette

线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流Edward Lee
 
Am I reading GC logs Correctly?
Am I reading GC logs Correctly?Am I reading GC logs Correctly?
Am I reading GC logs Correctly?Tier1 App
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationAlexey Lesovsky
 
RxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsRxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsBrendan Gregg
 
G1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningG1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningSimone Bordet
 
Row Pattern Matching in SQL:2016
Row Pattern Matching in SQL:2016Row Pattern Matching in SQL:2016
Row Pattern Matching in SQL:2016Markus Winand
 
Java Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame GraphsJava Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame GraphsBrendan Gregg
 
SREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREsSREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREsBrendan Gregg
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBrendan Gregg
 
Performance Tuning EC2 Instances
Performance Tuning EC2 InstancesPerformance Tuning EC2 Instances
Performance Tuning EC2 InstancesBrendan Gregg
 
Linux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF SuperpowersLinux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF SuperpowersBrendan Gregg
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance AnalysisBrendan Gregg
 

En vedette (13)

Enum开锁
Enum开锁Enum开锁
Enum开锁
 
线上问题排查交流
线上问题排查交流线上问题排查交流
线上问题排查交流
 
Am I reading GC logs Correctly?
Am I reading GC logs Correctly?Am I reading GC logs Correctly?
Am I reading GC logs Correctly?
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming Replication
 
RxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance ResultsRxNetty vs Tomcat Performance Results
RxNetty vs Tomcat Performance Results
 
G1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and TuningG1 Garbage Collector: Details and Tuning
G1 Garbage Collector: Details and Tuning
 
Row Pattern Matching in SQL:2016
Row Pattern Matching in SQL:2016Row Pattern Matching in SQL:2016
Row Pattern Matching in SQL:2016
 
Java Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame GraphsJava Performance Analysis on Linux with Flame Graphs
Java Performance Analysis on Linux with Flame Graphs
 
SREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREsSREcon 2016 Performance Checklists for SREs
SREcon 2016 Performance Checklists for SREs
 
Blazing Performance with Flame Graphs
Blazing Performance with Flame GraphsBlazing Performance with Flame Graphs
Blazing Performance with Flame Graphs
 
Performance Tuning EC2 Instances
Performance Tuning EC2 InstancesPerformance Tuning EC2 Instances
Performance Tuning EC2 Instances
 
Linux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF SuperpowersLinux 4.x Tracing Tools: Using BPF Superpowers
Linux 4.x Tracing Tools: Using BPF Superpowers
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance Analysis
 

Similaire à Shell,信号量以及java进程的退出

为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)Kris Mok
 
Linux基础
Linux基础Linux基础
Linux基础zhuqling
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 
基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析CC
 
Ruby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for MacRuby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for MacMarsZ Chen
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践Na Lee
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newYiwei Ma
 
Elastic stack day-2
Elastic stack day-2Elastic stack day-2
Elastic stack day-2YI-CHING WU
 
Linux network monitoring hands-on pratice
Linux network monitoring hands-on praticeLinux network monitoring hands-on pratice
Linux network monitoring hands-on praticeKenny (netman)
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Sery lvs+keepalived
Sery lvs+keepalivedSery lvs+keepalived
Sery lvs+keepalivedcolderboy17
 
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來Shengyou Fan
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)Yiwei Ma
 

Similaire à Shell,信号量以及java进程的退出 (20)

Rootkit 101
Rootkit 101Rootkit 101
Rootkit 101
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
 
Linux基础
Linux基础Linux基础
Linux基础
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 
基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
 
Ruby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for MacRuby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for Mac
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 new
 
Elastic stack day-2
Elastic stack day-2Elastic stack day-2
Elastic stack day-2
 
Linux network monitoring hands-on pratice
Linux network monitoring hands-on praticeLinux network monitoring hands-on pratice
Linux network monitoring hands-on pratice
 
Linuxguide4f2e
Linuxguide4f2eLinuxguide4f2e
Linuxguide4f2e
 
LinuxGuide4F2E
LinuxGuide4F2ELinuxGuide4F2E
LinuxGuide4F2E
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Sery lvs+keepalived
Sery lvs+keepalivedSery lvs+keepalived
Sery lvs+keepalived
 
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
[Modern Web 2016] 讓你的 PHP 開發流程再次潮起來
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)
 
Win dbg入门
Win dbg入门Win dbg入门
Win dbg入门
 

Plus de wang hongjiang

中等创业公司后端技术选型
中等创业公司后端技术选型中等创业公司后端技术选型
中等创业公司后端技术选型wang hongjiang
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closureswang hongjiang
 
深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)wang hongjiang
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析wang hongjiang
 

Plus de wang hongjiang (9)

中等创业公司后端技术选型
中等创业公司后端技术选型中等创业公司后端技术选型
中等创业公司后端技术选型
 
Scala类型系统
Scala类型系统Scala类型系统
Scala类型系统
 
functional-scala
functional-scalafunctional-scala
functional-scala
 
Scala function-and-closures
Scala function-and-closuresScala function-and-closures
Scala function-and-closures
 
泛型总结
泛型总结泛型总结
泛型总结
 
深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)深入剖析Concurrent hashmap中的同步机制(下)
深入剖析Concurrent hashmap中的同步机制(下)
 
聊一些电影
聊一些电影聊一些电影
聊一些电影
 
Aswan&hump
Aswan&humpAswan&hump
Aswan&hump
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
 

Shell,信号量以及java进程的退出

Notes de l'éditeur

  1. 只有前台作业中的进程才能够从控制终端读取输入。这个限制条件避免了多个作业竞争读取终端输入。如果后台作业尝试从终端读取输入,就会接收到一个SIGTTIN信号。SIGTTIN信号的默认处理动作是停止作业。
  2. 一台大型主机往往需要支持许多用户同时使用,每个用户所使用操作的设备,就叫做Termial——终端,终端使用通信电缆与电脑主机连接,甚至可以通过电信网络(电话、电报线路等等)连接另一个城市的电脑。 照片来自:带你逛西雅图活电脑博物馆(五) - 古董电脑室 - 知乎专栏
  3. Console 源自管风琴的控制台,在钢琴方面 根据高度不同,小型成为 spinet, 中型的是 console ,大型或专业型是 studio
  4. 控制进程通常就是 shell, SIGHUP 引发的连锁反应,