繁体   English   中英

cygwin杀死进程问题

[英]cygwin kill process issue

我试图在Cygwin中运行shell脚本,但是在将变量传递到subshel​​l时遇到问题!

我有一个非常简单的脚本,实际上可以获取进程的PID,因此我想从脚本中杀死该进程。

# my_proc_kill.sh
#
export c=$(ps -W | grep -ir behave | sed 's/\([0-9]\+\).*/\1/')
echo $c
#1
/bin/kill -f $c     
#2                  
sh -c '/bin/kill -f ${c}' "$c" 
#3       
sh -c '/bin/kill -f $@' _ "$c"        
#4
e=$(taskkill /PID $c)

我试图用四种不同的方式杀死该进程,但没有一种有效!

我不知道为什么直接在Cygwin终端中调用(#1)和(#4)可以正常工作,但是当我运行“ my_proc_kill.sh”时却不能。

我注意到的另一件事是,对于(#4),如果我将“ $ c”替换为实际的进程号,然后运行“ my_proc_kill.sh”,那么它将起作用。 因此,看起来变量值“ $ c”没有传递给“ taskkill”! 如何修改代码,以便taskkill知道变量“ $ c”?!?

但是,只要我没有杀死该进程,就不应该为该进程固定PID,而不管我访问该进程ID的外壳是什么?

请告知如何解决这个问题?

这是运行脚本时收到的错误消息:

5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid:
ERROR: Invalid query

为什么“ kill”将其视为非法pid? 但是,当我在Cygwin终端中使用相同的PID号(在本例中为5040)时,它起作用吗? (以下可以)

$/bin/kill -f 5040

任何想法如何解决这个问题?

提前致谢。

您的输出似乎表明您正在尝试杀死同一PID 5次。

我使用红帽的cygwin(CYGWIN_NT-6.1-WOW64)运行了脚本的修改版本:

#!/bin/bash

export c=$(ps -W | grep -ir notepad | sed 's/\([0-9]\+\).*/\1/')
echo $c

/bin/kill -f $c

我没有任何奇怪的举动。 成功的kill命令将输出PID(在第一行显示)。

如果将最后一行重复4次,我会收到错误消息。

除此之外,最后一个PID是子进程,当父进程执行时,该子进程会终止-就像是树上的杀手。

作为替代建议,除了/ IMAGE选项之外,我还通过使用带有/ F参数的taskkill来执行killkill以使用dirty方式来匹配exe名称而不是指定PID。 提供的示例:

taskkill /?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM