如何在杀死进程时禁用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
相关产品推荐
相关产品推荐

