Linux下如何正确地kill java进程

Python014

Linux下如何正确地kill java进程,第1张

多数人可能会回答 kill -9 pid,这是一种在多数情况下正确的做法。不过本文打算阐述使用kill -9带来的一些问题,并给出另一种标准的kill方式。

标准中断信号

在Linux信号机制中,存在多种进程中断信号(Linux信号列表 )。其中比较典型的有 SIGNKILL(9) 和 SIGNTERM(15).

SIGNKILL(9) 和 SIGNTERM(15) 的区别在于:

SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。

SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。

由此可见,SIGNTERM(15) 才是理论上标准的kill进程信号。

SIGNKILL(9) 带来的问题

先看一段程序

会。

java程序执行一半被kill掉,非守护线程中止时,会报异常,在Linux系统下执行会报以上异常信息。

java程序的执行方式:编译+解释混合,在编译基础上进行解释运行的语言。

以下是Minecraft通用指令:

clear:清除玩家的物品

clone:复制或移动某区域内的方块

deop:撤销玩家的管理员身份

difficulty:调整游戏难度

effect:给予实体状态效果

enchant:对实体手持物品进行附魔

execute:在改变执行者、执行位置和角度,添加限制条件,并储存其输出值的情况下执行另一条命令

experience/xp:更改玩家的经验和等级

fill:在指定区域填充指定方块

function:执行函数

gamemode:修改游戏模式

gamerule:查看和修改游戏规则

give:给予玩家指定物品

help/?:列出可用指令、查看特定指令用法

kick:将玩家踢出服务器

kill:移除或杀死实体

list:列出在服务器中的玩家

locate:定位特定结构

me:以“* 执行者名称+动作”的格式发送一条旁白信息

op:给予玩家管理员身份

particle:显示粒子

playsound:播放音效

reload:重新加载数据包

say:通过聊天框向玩家发送消息

schedule:在经过指定的时间后执行函数

scoreboard:管理和查看记分板的目标、玩家和队伍

setblock:放置指定方块

setworldspawn:设置世界出生点

spawnpoint:设置特定玩家的重生点

spreadplayers:散步玩家

stopsound:停止音效

summon:生成实体

tag:管理实体的记分板标签

tell/msg/w:通过聊天框向玩家发送私聊信息

tellraw:向玩家发送JSON文本消息

time:设置时间

title:设置和显示标题

teleport/tp:传送实体

weather:设置天气

whitelist:管理服务器中的白名单

以下是java版特有指令:

advancement:使特定玩家达成进度

attribute:管理实体属性

ban:将玩家列入黑名单

ban-ip:将一个ip地址列入黑名单

banlist:显示黑名单

bossbar:管理boss栏

data:查看或修改方块或实体的nbt数据

datapack:管理数据包

debug:开始或结束调试会话

defaultgamemode:设置默认游戏模式

forceload:强制加载区块

item:修改方块或实体物品栏内的物品

jfr:使用Java FlightRecorder分析数据和某些自定义事件

locatebiome:定位生物群系

loot:将指定的战利品放入物品栏或世界

pardon:将玩家移出黑名单

pardon-ip:将一个ip地址移出黑名单

perf:记录并保存性能分析数据

placefeature[新增:JE 1.18.2]:放置一个地物,目前不可用

publish:向局域网开放单人游戏世界

recipe:给予或剥夺玩家配方

save-all:将服务器保存至硬盘

save-off:禁用服务器的自动保存

save-on:启用服务器的自动保存

seed:输出世界种子

setidletimeout:设置踢出空闲不动玩家的时间

spectate:使处于旁观者模式的玩家进入另一个实体的视角

stop:停止服务端

team:管理队伍

teammsg:给使用命令的实体所在的队伍全体成员发送消息

trigger:修改一个准则为“触发器”的记分板目标

worldborder:控制世界边界