在脚本中终止进程时kill -9 $PID &>/dev/null
,下一个命令终止后仍会在终端上打印一条消息。如何停止此行为?
例如
while true; do
/usr/bin/dostuff -a -b -c
PID=$(pidof -o %PPID /usr/bin/dostuff)
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
将会打印类似
hello
./my-cript.sh: line 12: 7134 Killed
/usr/bin/dostuff -a -b -c
当我只想打印“你好”时
编辑: 干净的解决方案是在子 shell 中运行该程序,或者放弃它。
#SOLUTION
while true; do
/usr/bin/dostuff -a -b -c &
disown
PID=$!
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
答案1
输出行不会重定向到/dev/null因为他们不是标准输出/标准错误来自杀进程。它们是 shell 的作业控制机制的输出。
如果你使用狂欢,你可以运行一个否认作业调用后立即执行:
while true; do
/usr/bin/dostuff -a -b -c
### remove from shell job table
disown
PID=$(pidof -o %PPID /usr/bin/dostuff)
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
我在测试过这个bash v3.2.39在 Debian Lenny 上,使用/bin/sleep 10 &
以下命令代替上述/usr/bin/dostuff
命令:
./tmp.sh
hello
hello
hello
hello
^C
答案2
错误重定向无效,因为该消息不是由 kill 打印的;它是在后台作业终止时由 shell 打印的(我假设缺少 &)。
您可以通过在子 shell 中运行并使用括号来避免这种情况(但请注意其他潜在问题):
while true; do
(
/usr/bin/dostuff a b c &
PID=$!
sleep 1
kill -9 $PID
)
echo hello
done
答案3
您可以执行set -b
并在 SIGCHLD 上安装一个陷阱。我认为默认的 SIGCHLD 处理程序会 (立即) 将作业状态打印到终端set -b
。在这里您将覆盖它。