假设我有一个bash脚本(foo.sh
),它以非常简化的形式,如下所示:
echo "hello" sleep 100 & ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9 echo "bye"
第三行模仿pkill
,默认情况下我在Mac OS X上没有,但您可以将其视为相同pkill
.但是,当我运行此脚本时,我得到以下输出:
hello foo: line 4: 54851 Killed sleep 100 bye
如何抑制中间的线条以便我所看到的是hello
和bye
?
虽然disown
可能有消息的副作用 ; 这就是你如何开始这个过程,使消息真正沉默,而不必放弃对过程的工作控制.
{ command & } 2>/dev/null
如果你仍然想要命令自己的stderr(只是在stderr上沉默shell的消息),你需要将进程'stderr发送到真正的stderr:
{ command 2>&3 & } 3>&2 2>/dev/null
要了解重定向的工作原理:
从BashGuide: http://mywiki.wooledge.org/BashGuide/TheBasics/InputAndOutput#Redirection
说明教程: http://bash-hackers.org/wiki/doku.php/howto/redirection_tutorial
还有一些信息: http://bash-hackers.org/wiki/doku.php/syntax/redirection
顺便说一下; 不要用kill -9
.
我也有义务对你的评论:
ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
这将使任何UNIX/Linux用户的眼睛充满线索.而且,每次你解析ps
,一个仙女死了.做这个:
kill $!
甚至工具pgrep
也基本上都被设计破坏了.虽然他们在匹配流程方面做得更好,但基本缺陷仍然存在:
竞争:当您获得PID输出并将其解析回来并将其用于其他内容时,PID可能已经消失,甚至被完全不相关的进程取代.
责任:在UNIX流程模型中,父级负责管理其子级,其他人不应该这样做.父母应该保留孩子的PID,如果它想要发信号,只有父母可以可靠地这样做.UNIX内核的设计假设用户程序将遵循这种模式,而不是违反它.