【问题标题】:BASH - weird characters coming out from a pipeBASH - 从管道中出来的奇怪字符
【发布时间】:2012-04-03 08:58:13
【问题描述】:

我有这个脚本可以简单地杀死一个应用程序

KEY_NAME=/some/path
kill `ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'`
exit 0

如果我手动将 kill 命令编写为 oneliner,它就会起作用。但是我必须将它作为不起作用的脚本运行。所以我尝试调试它,这是结果

[user@server logs]$ bash -x ./script.sh
+ KEY_NAME=/some/path
++ ps -ef
++ grep /some/path
++ grep -v grep
++ awk '{ print $2 }'
+ kill $'20557\r'
: arguments must be process or job IDs
+ exit 0

为什么我总是在kill 行上看到那些奇怪的字符?我怎样才能摆脱它们?

【问题讨论】:

  • 如果将 head -1 添加到该管道会发生什么?
  • 你试过killall吗?但是,如果您要杀死自己的程序,you might want to reconsider
  • @l0b0 我没有,我可能不会。我不想最终杀死比我应该拥有的更多的进程......
  • @Tomas:那么你应该真的阅读链接。

标签: linux bash awk grep kill


【解决方案1】:

您得到乱码的原因可能是(我无法验证它,因为我无权访问您的环境),因为 subshel​​l 返回了不止一行。

试试这个:

KEY_NAME=/some/path
for pid in $(ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }')
  do
    kill $pid
  done
exit 0

【讨论】:

    【解决方案2】:

    可能是返回的 pid 数大于 1 将您的行更改为

    ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'|xargs kill
    

    【讨论】:

      【解决方案3】:

      您可以通过调用pkill 来替换所有这些。使用 -f 选项,完整的命令行用于匹配(不仅仅是进程名称),因此您仍然可以匹配路径。

      pkill -f $KEY_NAME
      

      除了更简单之外,它还可以让您更轻松地控制要杀死的内容,例如仅杀死特定用户/组拥有的进程或仅杀死最旧/最新的进程。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2021-03-10
        • 2017-10-11
        • 1970-01-01
        • 2012-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        相关资源
        最近更新 更多