0

我正在尝试在 Cygwin 中运行一个 shell 脚本,但是我在将变量传递给子 shell 时遇到了问题!

我有一个非常简单的脚本,它实际上获取进程的 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

知道如何解决这个问题吗?

提前致谢。

4

1 回答 1

0

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

我使用 red-hat 的 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 来匹配 exe 名称而不是指定 PID。提供的示例:

taskkill /?
于 2013-06-18T22:53:55.797 回答