一、问题

Linux系统Shell中提交了一个脚本,但是需要停止这个进程,如何处理?

二、方案1

killall fileName

说明:killall是一个命令,不是kill all,fileName是脚本名,此方法简单粗暴。

三、方案2

1、查看进程编号

ps -ef | grep XXXX(shell脚本名).sh

ps参数:
-e:显示所有进程
-f:全格式显示
ps -ef 第二个参数就是进程ID 

输出结果

linux结束docker linux结束sh脚本_linux

grep是查找命令,比如 grep aaa | grep -v bbb:在查询aaa结果中,过滤掉包含了bbb的行。
grep -v 可以理解为 grep not
举例:cat test.log | grep "login" | grep -v "deviceType"表示找出test.log中包含login关键字,且没有deviceType这个字段的行 

可现在我们查找出脚本有两个进程号,为什么会这样呢?

因为你查找进程时用到了grep命令,而这个命令执行的时候带有你查找的进程参数,同时这也是一个进程。

例如 这条命令 ps -ef | grep test.sh 其实是分两步执行的 先执行ps -ef 再执行 grep test.sh 。这个命令本身执行的时候也是一个进程,并把也带有test.sh。

所以你要查找test.sh进程,需要把 grep test.sh这个进程过滤掉,才是最后的结果,怎么过滤呢,肯定不能用test.sh做关键字,只能用grep做关键字

2、过滤

grep file-flume-kafka | grep -v grep 

# file-flume-kafka为脚本名,并去除包含grep的行,避免影响最终结果正确性

3、终止进程

这里的grep --color=auto 是指进程grep进程本身, 进程108384才是正在执行的shell脚本

kill 108384

一步到位的命令

ps -ef | grep XXX.sh | grep -v grep | awk '{print $2}' | xargs kill

awk ‘{print $2}’:逐行的读入,以空格为默认分隔符将每行切片,取第二行。
awk参数 -F : 指定输入文件折分隔符。
比如awk -F : ‘/^root/{print $7}’ passwd 表示搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。

xargs kill:将前面的运行结果作为kill命令的参数运行。
xargs表示取出前面命令运行的结果,作为后面命令的输入参数。
xargs可选项:-n1,将每一个参数传给后面命令依次执行。