You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在杀死进程时禁用stdout和stderr的Killed提示信息?

如何禁用bash杀死子进程后的Killed提示信息?

问题描述

我有一个进程ID数组,需要遍历数组逐个杀死进程。杀死进程后,终端会显示类似abc.sh: line 4: 10157 Killed ./daemon1 > a.txt 2>&1的提示信息。即使使用&> /dev/null将kill命令的stdout和stderr重定向到/dev/null,仍会在杀死第一个守护进程时出现该提示。

脚本代码

#!/bin/bash

set -e

purge () {
  for pid in ${pids[@]}; do
    kill -9 $pid &> /dev/null
  done
}

trap purge EXIT

./daemon1 > a.txt 2>&1 & pids+=($!)
./daemon2 > b.txt 2>&1 & pids+=($!)
./daemon3 > c.txt 2>&1 & pids+=($!)

for pid in ${pids[@]}; do
  echo "process: $pid"
done

环境信息

  • bash版本:
GNU bash, version 5.2.21(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
  • echo $-输出:
ehB

解决方案

这个提示不是来自kill命令本身,而是bash在检测到后台子进程被终止时主动打印的状态通知。以下是两种可靠的禁用方法:

方法1:启动后台进程后立即disown

disown会让bash停止跟踪目标后台进程,进程终止时自然不会再输出提示。修改启动后台进程的代码:

./daemon1 > a.txt 2>&1 & pids+=($!); disown $!
./daemon2 > b.txt 2>&1 & pids+=($!); disown $!
./daemon3 > c.txt 2>&1 & pids+=($!); disown $!

方法2:在清理函数中临时禁用监控模式

bash默认开启监控模式(set -m),会自动报告后台进程状态。可以在purge函数中临时关闭该模式,完成清理后再恢复:

purge () {
  set +m
  for pid in ${pids[@]}; do
    kill -9 $pid &> /dev/null
  done
  set -m
}

补充说明

  • disown方式更精准,仅针对指定进程生效,不会影响其他后台进程的状态报告;set +m是全局临时禁用,适合批量处理场景。
  • 若脚本不需要set -e(遇到错误立即退出),也可考虑移除该设置,但需评估对脚本其他逻辑的影响。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:37:19