【问题标题】:cygwin kill process issuecygwin kill 进程问题
【发布时间】:2013-06-18 21:59:57
【问题描述】:

我正在尝试在 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,只要我没有杀死该进程,不管我正在访问哪个 shell 进程 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

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

提前致谢。

【问题讨论】:

  • 1.将 echo $c 替换为 echo .$c. 以确保 $c 不包含空格左右。 2. kill -f 是什么意思?在我的 ubuntu 10 上未知。 3. ps -W | grep -ir behave... 不也打印 grep 的 pid 吗? 4. 为什么是grep -r? 5. ps -W 是什么?
  • 我认为这些不是问题。因为在脚本中我只是将 $c 替换为实际的 PID 号(对于我的情况是 5040),我仍然得到与以前完全相同的错误。换句话说,我将脚本更改为 (/bin/kill -f 5040) 仍然是一样的东西。我也试过(/bin/kill/5040)还是同样的错误。但是当我在 Cygwin 命令行中键入这个精确的表达式 (/bin/kill -f 5040) 时,它会终止进程,并且一切看起来都很好。

标签: bash shell cygwin


【解决方案1】:

您的输出似乎表明您正在尝试杀死相同的 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 有可能是一个子进程,它在父进程终止时终止 - 就像树杀一样。

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

taskkill /?

【讨论】:

  • 我使用的是完全一致的 Cygwin 版本 (CYGWIN_NT-6.1-WOW64),我刚刚从脚本中删除了所有其他内容,并保持原样(只有三行),但是再次,运行它后,我得到“kill:非法 pid:11132”,但 11132 是正确的 PID,一旦我在命令行中执行 (/bin/kill -f 11132),一切正常!你知道会发生什么吗?
  • 更新:经过很长时间,我刚刚解决了这个问题。问题一直是回车符。在 GVIM 中,我设置了“:e ++ff=unix”,我看到了所有的回车符,一旦我读到它们,一切就开始正常了。
  • @user2201373:也许最好将您的解决方案添加到问题中或将其作为答案发布以便于查找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多