Linux之for循环进程终止的方法

需求是这样:

#!/usr/bin/bash

day=0
tmpday=0
tmp2=0
#for循环执行进程,省的一个个手动跑
for((day=1;day<=59;day++))
do
    if [[ $day -lt 10 ]]; then
    tmpday=2018010${day}
    elif [[ $day -le 31 ]]; then
    tmpday=201801${day}
    elif [[ $day -lt 41 ]]; then
    tmp2=`expr $day - 31`
    tmpday=2018020${tmp2}
    else
    tmp2=`expr $day - 31`  
    tmpday=201802${tmp2}
    fi
    echo ${tmpday};
    /usr/local/hadoop/bin/hadoop jar /home/workspace/xm-bin.jar   com.xm.hadoop.Main \
-Drp.input.data1=/input/data1/${tmpday}-data1.txt \
-Drp.input.data2=/input/data2/ \
-Drp.output.path=/output/marathon/${tmpday}
done

以上是一个shell脚本的内容,名为123.sh,这个脚本的目的是使用 Hadoop根据两个输入文件计算出一个结果,由于希望跑59天,所以按照原来的想法是把这个脚本跑59遍,每跑完一次改一下参数,后来了解到可以使用shell中的for循环,然后在for循环外面建立变量,此乃背景

问题是什么呢
如果我跑完了一天发现原来写的hadoop分析文件(也就是xm-bin.jar)有问题,需要重跑,这个时候怎么办呢,最简单粗暴的方法就是使用如下命令

hadoop job -kill job_123456789434_1234

但是如果for循环很多的话,比如100次,按照这个方法得执行100次这个命令,头大

后来想到linux中杀进程的方法都是kill + 进程id

现在问题就转变成如何获取正在运行的123.sh脚本的进程id

ps -aux

进程太多,根本找不到

ps -aux|grep 123.sh 或者 ps -ef|grep 123.sh

后者可以查到父进程的id,不过执行kill 父进程id根本无效

即使加上信号也没用,就是下面这样

kill -s 9 进程id

皇天不负苦心人,终于找到了答案,参考如何查找SHELL的进程号,并杀死

具体步骤就是:

扫描二维码关注公众号,回复: 1585411 查看本文章

1、在123.sh中第一行添加如下代码

echo "$$" > /tmp/xm_process.pid

这样,该脚本的id就会被写到/tmp/xm_process.pid这个文件中去

2、查看该进程id,并终止进程

[root@namenode xm]# cat /tmp/xm_process.pid
23452
[root@namenode xm]# kill 26398

3、123.sh脚本虽然被kill了,但是已经在执行的hadoop作业却依然在跑,如果该作业有很多job,那么它就会跑完所有job才会停止,所以需要kill掉正在跑的job,这样才会完全终止

hadoop job -kill job_123456789434_1234

猜你喜欢

转载自blog.csdn.net/diyangxia/article/details/79461800