假设我有一个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
?
答案 0 :(得分:14)
虽然disown
可能具有使消息静音的副作用;这就是你如何开始这个过程,使消息真正沉默,而不必放弃对过程的工作控制。
{ command & } 2>/dev/null
如果你仍然想要命令自己的stderr(只是在stderr上沉默shell的消息),你需要将进程'stderr发送给真正的stderr:
{ command 2>&3 & } 3>&2 2>/dev/null
了解重定向的工作原理:
顺便说一下; don't use kill -9
我也有义务对你发表评论:
ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
这将使任何UNIX / Linux用户的眼睛充满线索。而且,每当你解析ps
时,仙女就会死去。这样做:
kill $!
即使像pgrep
这样的工具也基本上被设计破坏了。虽然他们在匹配流程方面做得更好,但基本缺陷仍然存在:
答案 1 :(得分:3)
被拒绝怎么样?这主要适用于Linux上的Bash。
echo "hello"
sleep 100 &
disown
ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
echo "bye"
修改:更好地匹配海报代码。
答案 2 :(得分:1)
信息是真实的。代码也杀死了grep进程。
运行ps ax | grep sleep
,你应该在列表中看到你的grep进程。
在这种情况下我通常做的是ps ax | grep sleep | grep -v grep
编辑:这是旧版问题的答案,其中作者省略了排除grep的杀戮序列。我希望我仍能得到一些代表回答上半场。
答案 3 :(得分:1)
在这里使用'wait'有一个更好的解决方案:https://stackoverflow.com/a/10200191/1208218
答案 4 :(得分:0)
禁用作业终止消息的另一种方法是将命令置于sh -c 'cmd &'
构造中。
正如已经指出的那样,没有必要模仿pkill
;您可以将$!
的值存储在另一个变量中。
echo "hello"
sleep_pid=`sh -c 'sleep 30 & echo ${!}' | head -1`
#sleep_pid=`sh -c '(exec 1>&-; exec sleep 30) & echo ${!}'`
echo kill $sleep_pid
kill $sleep_pid
echo "bye"
答案 5 :(得分:-1)
您是否尝试停用作业控制?它是一个非交互式的shell,所以我猜它默认是关闭的,但尝试它并没有什么坏处...它受-m(监视器)shell变量的调节。