最近在jupyter notebook中运行一个回归任务的时候总会出现一个Kernel Restarting的提示,python输出部分也没有报错,很是迷茫。

然后在PyCharm中Debug了一下相关的代码,输出显示python进程在运行时被杀掉了,最后的输出是:
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

这里给出的回答是“In most of the cases, it caused because of excessive memory usage.”

因运行时CPU占用较高,自己不确定原因,使用dmesg查询日志了解一下具体的原因方便修改程序。终端中输入:
dmesg -T | grep -E -i -B100 'killed process'

得到日志如下:

[一 7月 16 20:07:50 2018] Out of memory: Kill process 648 (python) score 607 or sacrifice child
[一 7月 16 20:07:50 2018] Killed process 648 (python) total-vm:9058460kB, anon-rss:6678640kB, file-rss:0kB, shmem-rss:0kB

可以看出python被杀掉的原因确实是OOM。

这里涉及到Linux的信号机制,比如常见的Ctrl-C就是向程序发送SIGINT信号,其中部分信号可以用程序捕获并进行相应的处理,放个表格在这备用。

| 信号 | 值 | 处理动作 | 发出原因 |
|-| - | - |
| SIGHUP | 1 | A | 终端挂起或者控制进程终止 |
| SIGINT | 2 | A | 键盘中断 |
| SIGQUIT | 3 | C | 键盘的退出键被按下 |
| SIGILL | 4 | C | 非法指令 |
| SIGABRT | 6 | C | 由abort(3)发出的退出指令 |
| SIGFPE | 8 | C | 浮点异常 |
|** SIGKILL** | 9 | AEF | **Kill信号 **|
| SIGSEGV | 11 | C | 无效的内存引用 |
| SIGPIPE | 13 | A | 管道破裂: 写一个没有读端口的管道 |
| SIGALRM | 14 | A | 由alarm(2)发出的信号 |
| SIGTERM | 15 | A | 终止信号 |
| SIGUSR1 | 30,10,16 | A | 用户自定义信号1 |
| SIGUSR2 | 31,12,17 | A | 用户自定义信号2 |
| SIGCHLD | 20,17,18 | B | 子进程结束信号 |
| SIGCONT | 19,18,25 | 进程继续 |(曾被停止的进程) |
| SIGSTOP | 17,19,23 | DEF | 终止进程
| SIGTSTP | 18,20,24 | D | 控制终端(tty)上按下停止键 |
| SIGTTIN | 21,21,26 | D | 后台进程企图从控制终端读 |
| SIGTTOU | 22,22,27 | D | 后台进程企图从控制终端写 |


参考:

https://www.cnblogs.com/xybaby/p/8098229.html
https://stackoverflow.com/questions/43268156/process-finished-with-exit-code-137-in-pycharm