我们的hive web是调用polestar restful service(https://github.com/lalaguozhe/polestar-1)来执行具体的hive或者shark语句的,这几天有用户说hive web上的kill按钮失效了,虽然已经显示停止了查询,但是其实提交到jobtracker的mapred job或者spark worker节点上作业还在running。我看了下,确实有这个问题。
polestar对于每一条query执行的命令如下
sudo -u yukang.chen bash -c "echo \$\$ > /tmp/hive.pid;source /etc/profile;export KRB5CCNAME=/tmp/krb5cc_500;hive -e 'select count(1) from hippolog'"

先sudo成提交query的用户,将用户bash -c进程号输出到一个文件下,设置好环境变量,再起一个java子进程执行语句

ps: 输出进程号到一个文件下是为了之后要kill作业用,这边由于$符号在双引号里面,所以会被替换成当前用户的bash进程号,而我们需要获取的是sudo成指定用户执行命令的进程号,所以要对$符号加上反斜杠来转义

yukang.chen用户终端看ps xuf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1158 30497 0.0 0.0 106204 1556 pts/25 S+ 15:08 0:00 bash -c echo $$ > /tmp/hive.pid;source /etc/profile;export KRB5CCNAME=/tmp/krb5cc_500;hive -e 'select count(1) from hippolog'
1158 30504 29.5 2.2 9644528 178476 pts/25 Sl+ 15:08 0:28 \_ /usr/local/jdk/bin/java -Dproc_jar -Xmx7000m -server -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -Dhadoop.log.dir=/data/logs

java进程的PPID就是bash -c的进程号30497(也是/tmp/hive.pid的值),构成父子进程关系

用户前端按下kill按钮后,后端会sudo成指定用户,先读取pid文件,再kill -9 pid
观察发现父进程是被kill掉了,但是子进程还活着,而且PPID已经换成为1,也就是init(1)进程
查看命令ps -p 30504 -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S 1158 30504 1 16 80 0 - 2411132 futex_ pts/25 00:00:28 java

这种kill方式导致了虽然kill了父进程,但是真正执行hive和shark的java进程还活着,没有退出

解决方式有两种:
1. 使用kill -- -<PPID>
这种方式执行语句不变, 更改kill命令,PPID前是一个负号,这样会将以PPID为首的整个进程树(包括子进程)都kill掉

2. 使用exec命令
这种方式需要更执行语句,在hive命令前加上exec
exec命令会将子进程替换当前进程执行(bash -c 替换成hive java进程),如果hive之后还有后续命令都不会执行.
执行语句如下:
sudo -u yukang.chen bash -c "echo \$\$ > /tmp/hive.pid;source /etc/profile;export B5CCNAME=/tmp/krb5cc_500;exec hive -e 'select count(1) from hippolog'"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1158 32068 59.0 3.6 9577964 290476 pts/25 Sl+ 15:18 0:28 /usr/local/jdk/bin/java -Dproc_jar -Xmx7000m -server -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -Dhadoop.log.dir=/data/logs -Dh

因为child java process替换了parent bash -c process,所以看到的只有一个java process,这样我们kill的话,就很容易了,不需要kill子进程

linux kill进程和子进程小trick的更多相关文章

  1. kill 进程的一些小细节

    终止前台进程,可以用Ctrl+C组合键.但对于后台进程需要用kill命令. kill PID 还可以加信号(参数),默认情况下是编号为15的信号.term信号将终止所有不能捕捉该信号的进程. -s 可 ...

  2. linux kill进程没有立刻停止

    前些天在执行restart脚本的时候遇到了一个奇怪的问题:1.第一次执行进程不见了,启动失败2.第二次重启进程成功,但是在kill的时候提示进程不存在需要重启两次进程才能成功 查看日志文件:第一次重启 ...

  3. Linux下进程间管道通信小作业

    在进行这次作业之前,我们先来看看什么是管道吧! 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间, ...

  4. linux kill 关闭进程命令

    杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的 ...

  5. Linux 杀死进程方法大全(kill,killall)

    杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志.   首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:   # kill -pid   注释:标准的kill命令通常 ...

  6. linux 中获取进程和kill进程的几种方法

    ps: ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占用了过多的资源等等. 注意:ps是显示瞬间进程的状态, ...

  7. Linux:kill 进程

    在使用Linux时,出现端口占用.进程已启动(但处于不可控状态)情况时如何处理? 发现已知端口被占用时,可以使用netstat -apn | grep yourPort 来查看占用该端口的进程的pid ...

  8. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...

  9. Linux下查找进程,kill进程

    1. ps命令用来查找linux运行的进程,常用命令: ps aux | grep 进程名:  eg:ps aux | grep admin 查找admin的进程 或者 ps -ef | grep j ...

随机推荐

  1. Struts1的实现原理

    一 开文背景 -- 废话讲一段~ 本文借助动力节点-王勇老师的视频教程中的引例来了解struts1的实现原理,虽然现在已经很少使用struts1了,但是了解了其原理之后,对了解其他mvc框架还是有较大 ...

  2. XMPP 服务器 Openfire 的 Emoji 支持问题(进行部分修改)

    当前最新版3.9.3已经可以支持Emoji  ----------------------------------------------------------------------------- ...

  3. django-extensions

    命令行: admin后台管理扩展 后面会出现个放大镜实现搜索补齐功能. 交互式的 Python Shells(shell_plus) 实现自动导入 如果遇到apps中包含的的models名字出现冲突, ...

  4. JAVA学习中好网站 - -

    http://www.54bk.com 我是博客 http://www.java-cn.com java中文网 http://java.sun.com sun官方网站 http://www.comej ...

  5. 联想K82------智能电视行业的野蛮入侵者

    智能电视行业近年来“渐入佳境”,一方面得力于智能手机.平板电脑的普及让数码产品的智能化趋势深入人心,智能电视自然成了IT行业的下一个增长点:另一方面则得力于部分企业敢于第一个吃螃蟹,通过他们的创新和开 ...

  6. asp.net上传控件使用

    protected void Button1_Click(object sender, EventArgs e) { string str = ""; if (FileUpload ...

  7. 数据库基础学习3-T-SQL语句

    一.语句操作的基本方法 1.选中执行. 2.注释的方法‘--’. 二.数据类型 整数:int,bigint,smallint 小数:float,decimal(长度,精度) 字符:char(n),va ...

  8. 道可叨 | Python 标准库 urllib2 的使用细节

    道可叨 | Python 标准库 urllib2 的使用细节 request = urllib2.Request(uri) request.add_header('User-Agent', 'fake ...

  9. swift 自定义TabBarItem

    1.效果图     2.NewsViewController.swift // // NewsViewController.swift // NavigationDemo // // Created ...

  10. PHP - 验证类

    <?php /** * 验证类 * * @lastmodify 2014-5-16 * @author jy625 */ class VerifyAction{ /** * 是否为空值 */ p ...