如何抑制Terminated
在bash脚本中终止进程后出现的消息?
我试过了set +bm
,但那不起作用.
我知道另一个解决方案涉及呼叫exec 2> /dev/null
,但是可靠吗?如何重新设置它以便我可以继续查看stderr?
Mar*_*gar 124
为了使消息静音,您必须stderr
在生成消息时重定向.由于该kill
命令发送一个信号,并不会等待目标进程作出回应,重定向stderr
的的kill
命令对你没有好.bash内置wait
是专门为此目的而制作的.
这是一个非常简单的示例,可以杀死最新的后台命令.(了解更多关于$!的信息.)
kill $!
wait $! 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
因为这两个kill
和wait
接受多个的pid,你也可以做批量杀死.这是一个杀死所有后台进程(当然是当前进程/脚本)的示例.
kill $(jobs -rp)
wait $(jobs -rp) 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
我是从bash带到这里的:默默杀死后台功能进程.
wno*_*ise 17
简短的回答是,你做不到.Bash始终打印前台作业的状态.监视标志仅适用于后台作业,仅适用于交互式shell,而不适用于脚本.
请参阅jobs.c中的notify_of_job_status().
如你所说,你可以重定向所以标准错误指向/ dev/null但是你会错过任何其他错误消息.您可以通过在运行脚本的子shell中执行重定向来使其成为临时的.这留下了原始环境.
(script 2> /dev/null)
Run Code Online (Sandbox Code Playgroud)
这将丢失所有错误消息,但只是从该脚本,而不是从该shell中运行的任何其他内容.
您可以通过将新文件描述符重定向到指向那里来保存和恢复标准错误:
exec 3>&2 # 3 is now a copy of 2
exec 2> /dev/null # 2 now points to /dev/null
script # run script with redirected stderr
exec 2>&3 # restore stderr to saved
exec 3>&- # close saved version
Run Code Online (Sandbox Code Playgroud)
但我不建议这样做 - 第一个的唯一好处是它保存了一个子shell调用,而更复杂,甚至可能改变脚本的行为,如果脚本改变了文件描述符.
编辑:
有关Mark Edgar给出的更合适的答案检查答案
小智 17
灵感来自MarcH的回答.我正在使用,kill -INT
因为他建议取得一些成功,但我注意到它并没有杀死一些进程.在测试了一些其他信号之后,我发现在SIGPIPE
没有消息的情况下它也会被杀死.
kill -PIPE
Run Code Online (Sandbox Code Playgroud)
或者干脆
kill -13
Run Code Online (Sandbox Code Playgroud)
解决方案:使用SIGINT(仅适用于非交互式shell)
演示:
cat > silent.sh <<"EOF"
sleep 100 &
kill -INT $!
sleep 1
EOF
sh silent.sh
Run Code Online (Sandbox Code Playgroud)
http://thread.gmane.org/gmane.comp.shells.bash.bugs/15798
Terminated
由 bash 3.x 和 4.x 的默认信号处理程序记录。只需在子进程的第一个处捕获 TERM 信号即可:
#!/bin/sh
## assume script name is test.sh
foo() {
trap 'exit 0' TERM ## here is the key
while true; do sleep 1; done
}
echo before child
ps aux | grep 'test\.s[h]\|slee[p]'
foo &
pid=$!
sleep 1 # wait trap is done
echo before kill
ps aux | grep 'test\.s[h]\|slee[p]'
kill $pid ## no need to redirect stdin/stderr
sleep 1 # wait kill is done
echo after kill
ps aux | grep 'test\.s[h]\|slee[p]'
Run Code Online (Sandbox Code Playgroud)