使用bash和regex在一行中查找并杀死一个进程

我经常需要在编程过程中杀死一个进程。

我现在的做法是:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

如何自动提取进程ID并在同一行中杀死它?

像这样:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
664786 次浏览

你可以用awk和backtics来做

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

awk中的2美元打印第2列,而backtics运行打印的语句。

但是一个更简洁的解决方案是python进程将其进程id存储在 /var/run中,然后您可以简单地读取该文件并杀死它。

仅使用awk(和ps)的方法:

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

通过使用字符串相等性测试,我阻止匹配这个过程本身。

bash中,您应该能够执行:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

其运作详情如下:

  • ps为您提供所有进程的列表。
  • grep过滤器基于您的搜索字符串,[p]是阻止您获取实际grep进程本身的技巧。
  • awk只是为您提供每行的第二个字段,即PID。
  • $(x)构造意味着执行x,然后获取其输出并将其放在命令行上。上面构造中的ps管道的输出是进程ID列表,因此您最终会得到像kill 1234 1122 7654这样的命令。

这里有一个记录显示它在行动:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

你可以看到它终结了所有的潜伏者。


更详细地解释grep '[p]ython csp_build.py'位:

当您执行sleep 3600 &后跟ps -ef | grep sleep时,您倾向于获得两个进程,其中包含sleepsleep 3600grep sleep(因为它们都包含sleep,这不是火箭科学)。

然而,ps -ef | grep '[s]leep'不会创建一个包含sleep的进程,而是创建grep '[s]leep',这是棘手的一点:grep找不到它,因为它正在寻找正则表达式“来自字符类[s](即s)的任何字符,后跟leep

换句话说,它正在寻找sleep,但grep进程是grep '[s]leep',其中没有sleep

当我看到这个(有人在SO上)时,我立即开始使用它,因为

  • 它比添加| grep -v grep;少一个过程
  • 这是优雅的偷偷摸摸,罕见的组合:-)

尝试使用

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

如果你有pmi

pkill -f csp_build.py

如果您只想针对进程名称(而不是完整的参数列表)进行grep,那么请关闭-f

您只能使用pkill '^python*'来杀死正则表达式进程。

如果你想在杀死之前看到你要杀死或找到的东西,只需使用pgrep -l '^python*',其中-l输出进程的名称。如果你不想使用 pkill,只使用:

pgrep '^python*' | xargs kill

我的任务是杀死放置在特定目录中的所有匹配regexp的内容(在selenium测试之后,并非所有内容都停止了)。这对我有用:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
killall -r regexp


-r, --regexp

将进程名称模式解释为扩展正则表达式。

杀死我们自己的进程从一个常见的PPID开始是很常见的,pji关联到–P标志对我来说是一个赢家。使用@ghostdog74示例:

# sleep 30 &
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

您不需要ps的用户开关。

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

我用这个来杀死Firefox,当它被脚本猛烈抨击和cpu抨击时:) 用你想死的应用程序替换“Firefox”。我在Bash shell上-OS X 10.9.3 Darwin。

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)

把-f传给pbit

pkill -f /usr/local/bin/fritzcap.py

. py文件的确切路径是

# ps ax | grep fritzcap.py
3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

我使用的是gkill processname,其中gbit是以下脚本:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
echo "Found $cnt processes - killing them"
ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
echo "No processes found"
fi

注意:它不会杀死命令行中有“grep”的进程。

在某些情况下,我想像这样同时杀死进程:

➜  ~  sleep 1000 &
[1] 25410
➜  ~  sleep 1000 &
[2] 25415
➜  ~  sleep 1000 &
[3] 25421
➜  ~  pidof sleep
25421 25415 25410
➜  ~  kill `pidof sleep`
[2]  - 25415 terminated  sleep 1000
[1]  - 25410 terminated  sleep 1000
[3]  + 25421 terminated  sleep 1000

但是,我认为在你的情况下有点不合适。(可能在后台运行python a、python b、python x…)

一个班轮:

ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

  • 打印第2栏:awk '{print $2}'
  • sudo是可选的
  • 运行kill -9 5124kill -9 5373等(杀死-15更优雅,但略慢)

奖金:

我也有2个快捷方式函数定义在我的.bash_profile (~/。bash_profile是osx,你必须看看什么适用于你的*nix机器)。

  1. p关键字
    • 列出所有包含关键字的Process
    • 用法例如:p csp_buildp python

bash_profile代码:

# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
  1. ka关键字
    • Kills一个ll具有此关键字的进程
    • 用法例如:ka csp_buildka python
    • 可选的杀死级别,例如:ka csp_build 15ka python 9

bash_profile代码:

# KILL ALL
function ka(){


cnt=$( p $1 | wc -l)  # total count of processes found
klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty


echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
p $1


echo -e '\nTerminating' $cnt 'processes .. '


ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
echo -e "Done!\n"


echo "Running search again:"
p "$1"
echo -e "\n"
}

我开始使用这样的东西:

kill $(pgrep 'python csp_build.py')

使用pgrep-可在许多平台上使用:

kill -9 `pgrep -f cps_build`

pgrep-f将返回所有符合“cps_build”的PID

要通过关键字midori杀死进程,例如:

kill -SIGTERM $(pgrep -i midori)

以下命令将派上用场:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

例如, ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
[1]+  Killed                  top

如果进程仍然卡住,请使用“-9”扩展名来hardmi,如下所示:

kill -9 $(ps -elf | grep top| awk {'print $4'})

希望有帮助……!

在bash中找到并杀死一行中的所有进程。

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'-给出与模式匹配的运行进程详细信息(uname、pid等)的列表。输出列表还包括搜索它的grep命令。现在为了杀死我们需要忽略这个grep命令进程。
  • ps -ef | grep '<exec_name>' | grep -v 'grep'-使用-v 'grep'添加另一个grep会删除当前grep进程。
  • 然后使用awk单独获取进程ID。
  • 然后将此命令保存在$(...)中并将其传递给kill命令,以杀死所有进程。

这将只返回pid

pgrep -f 'process_name'

所以要在一行中杀死任何进程:

kill -9 $(pgrep -f 'process_name')

或者,如果你知道进程的确切名称,你也可以尝试pidof:

kill -9 $(pidof 'process_name')

但是,如果你不知道这个过程的确切名称,pgrep会更好。

如果有多个进程以相同的名称运行,并且您想杀死第一个,那么:

kill -9 $(pgrep -f 'process_name' | head -1)

还要注意的是,如果你担心区分大小写,那么你可以像grep中一样添加-i选项。例如:

kill -9 $(pgrep -fi chrome)

有关信号和pgrep的更多信息,请参阅man 7 signalman signalman pgrep

如果pkill -f csp_build.py没有杀死进程,您可以添加-9来发送一个不会被忽略的杀死信号。即pkill -9 -f csp_build.py

的解决方案将使用精确的模式过滤进程,解析pid,并构造一个参数列表来执行杀死进程:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

#来自文档的EYZ0:

ps实用程序显示标题行,后跟包含

所有进程的控制终端的信息。

-e显示有关其他用户进程的信息,包括

-f显示uid、pid、父pid、最近的CPU使用率、进程启动

grep实用程序搜索任何给定的输入文件,选择

-e模式,--regexp=模式 指定在搜索输入时使用的模式:输入 如果行匹配任何指定的模式,则选择行。 当使用多个-e选项时,此选项最有用 指定多个模式,或者当模式以破折号开头时 (`-').

xargs-构造参数列表和执行实用程序

杀死-终止或发出进程信号

数字9信号-杀(非捕获,不可忽略的杀)

示例

ps -ef  | grep -e node -e loggerUploadService.sh -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

使用ps命令的-C标志

-C cmdlist
Select by command name.  This selects the processes whose
executable name is given in cmdlist.

第1例,简单命令

因此,如果您通过标准谢邦运行脚本并以他的名字调用它们:

/path/to/csp_build.py

你可能会发现

ps -C csp_build.py

所以

kill $(ps -C csp_build.py ho pid)

也许就足够了。

第2例,搜索cmd

稍微强一点,但仍然比这个问题中的大多数其他答案快得多…

如果你不知道这是如何运行的,或者如果你运行它们

python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py

您可以通过运行以下命令找到它们:

ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py

然后使用sed

kill $(ps -C python,python3,csp_build.py who pid,cmd |
sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')

这里有很多好的答案-我使用了OP接受的答案。只是添加了一个关于pkillpgrep的小警告。正如你从其手册页中看到的,在你的操作系统上,一些操作系统对进程名称有15个字符的限制。-f选项在我的操作系统上解决了这个问题,但在我找到这个选项之前,我遇到了麻烦!

基于https://stackoverflow.com/a/3510879/15603477答案。轻微优化。

ps aux | grep 'python csp_build.py' | head -1 | tr -s ' ' | cut -d " " -f 2 | xargs kill

通过使用tr -s ' '将多个空格(如果有)压缩为1个空格。

如果您遇到Operation not permitted,请按照此>>https://unix.stackexchange.com/questions/89316/how-to-kill-a-process-that-says-operation-not-permitted-when-attempted

我不喜欢纯粹基于grep的盲目结果来杀死东西——如果我错误地匹配了比预期更多的东西怎么办?

我知道这会被命令行纯粹主义者否决,但我更喜欢在这种情况下使用交互式过滤器,例如选择(apt-get安装选择)。使用这种工具,过滤后的结果会在您键入时显示,因此您可以确切地看到当您按回车键时会杀死什么。

因此,单线将成为

function killpick { ps ax | pick -q "$1" | awk  '{print $1}' | xargs kill -9; }

它本身提供了一个带有增量过滤的选择器,可选参数为过滤器提供了一个起始字符串。

如果你想在awk中做主要是,试试

  for i in $(jot 5); do
(python3 -c 'import sys; [ print(_) for _ in sys.stdin ]' ) & done;
  

sleep 1; ps aux | {m,g}awk '


/[p]ython/ {
_=(_)" "$2
} END {
system("echo \47 kill "(_)" \47")
system(      "kill -9 " _) }'




[302] 14236
[303] 14237
[304] 14238
[305] 14239
[306] 14240
[303]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[305]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[304]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[302]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[306]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
 

kill  14239 14237 14236 14240 14238
 

[305]    killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[303]    killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[306]  + killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[304]  - killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[302]  + killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )

对于基本bash版本

杀死$(pidof