现象
执行sbin/stop-all.sh
,提示:
|
|
jps显示进程都在:
|
|
原因分析
以Spark为例,Spark启动停止都是通过hadoop-daemon.sh
文件,其中部分代码如下:
|
|
可以看到,启动是会生成pid文件,停止时会读取pid文件,并kill "$TARGET_ID" && rm -f "$pid"
,在pid文件在不定义是,默认存放目录值tmp,linux系统默认每30天清理一次/tmp目录下的文件。pid文件丢失将导致无法正确关闭相应进程。
解决方法
pid文件的默认文件名格式如下:
|
|
通过代码可以知道,
|
|
所以,我们只需要找到对应进程的进程号,创建文件并添加就可以正常关闭进程
根治方法
既然tmp目录会被系统定时清理,那么我们重新设置对应服务的pid存放路径即可
修改hadoop-env.sh,增加:
|
|
修改spark-env.sh,增加:
|
|
重启对应服务:
|
|
通过这个问题我们可以知道,很多linux下对应的服务都有类似的控制脚本,或者可以添加类似的控制脚本,在存放pid文件时我们也要注意这个问题,防止因为系统原因,导致服务无法正常重启等问题。