我正在尝试在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)
我试图以四种不同的方式杀死这个过程,而不是它们有效!
我不知道为什么(#1)和(#4)在Cygwin终端中直接调用它们时工作得很好,但是当我运行“my_proc_kill.sh”时则不行。
我注意到的另一件事是(#4),如果我用实际的进程号替换“$ c”,然后运行“my_proc_kill.sh”,那么这将有效。所以,看起来变量值“$ c”没有传递给“taskkill”!! 如何修改代码,以便taskkill知道变量“$ c”?!?
但是,对于特定进程,不应该修复PID,只要我没有杀死进程,无论我访问该进程ID的shell是什么?
请告知如何解决这个问题?
以下是我运行脚本时收到的错误消息:
5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid:
ERROR: Invalid query
为什么“杀人”认为这是非法的pid? 但是当我在Cygwin终端中使用相同的PID号(在这种情况下为5040)时,它有效吗? (以下是可以的)
$/bin/kill -f 5040
知道如何解决这个问题吗?
提前致谢。
答案 0 :(得分: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 /?