禁止分叉命令被杀的通知

时间:2009-04-03 17:11:54

标签: linux bash macos

假设我有一个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

如何抑制中间的行,以便我看到hellobye

6 个答案:

答案 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这样的工具也基本上被设计破坏了。虽然他们在匹配流程方面做得更好,但基本缺陷仍然存在:

  • 种族:当你获得一个PID输出并将其解析回来并用于其他东西时,PID可能已经消失,甚至被一个完全不相关的过程取代。
  • 责任:在UNIX流程模型中,父级负责管理其子级,其他人不应该这样做。父母应该保留孩子的PID,如果它想要发信号,只有父母可以可靠地这样做。 UNIX内核的设计假设用户程序将遵循这种模式,而不是违反它。

答案 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变量的调节。