Linux 禁止发出终止分叉命令的通知

Linux 禁止发出终止分叉命令的通知,linux,bash,macos,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

假设我有一个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 <代码>和<代码>再见<代码>

< p>该消息是真的。代码也终止了grep进程

运行
ps ax | grep sleep
,您应该会在列表中看到您的grep进程

在这种情况下,我通常做的是
ps ax | grep sleep | grep-v grep


编辑:这是对旧形式问题的回答,作者省略了在kill序列中排除grep。我希望我在上半场的回答中仍能得到一些好评。

不认怎么样?这主要适用于我在Linux上的Bash

echo "hello"
sleep 100 &
disown
ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
echo "bye"

编辑:与海报代码更匹配。

您是否尝试停用作业控制?这是一个非交互式的shell,所以我猜默认情况下它是关闭的,但尝试一下并没有什么坏处。。。它由-m(monitor)shell变量调节。

disown
可能会产生使消息静音的副作用;这就是如何启动流程,使消息真正静音,而不必放弃对流程的作业控制

{ command & } 2>/dev/null
如果您仍然需要命令自己的stderr(只是在stderr上消音shell消息),则需要将进程的stderr发送到真正的stderr:

{ command 2>&3 & } 3>&2 2>/dev/null
要了解重定向的工作原理,请执行以下操作:

  • 从手册中:
  • 带插图的教程:
  • 还有更多信息:
顺便说一句

我也觉得有义务评论您的:

ps ax | grep sleep | grep -v grep | awk '{ print $1 } ' | xargs kill -9
这将给任何UNIX/Linux用户提供线索。此外,每次解析
ps
,一个仙女就会死去。这样做:

kill $!
甚至像
pgrep
这样的工具也基本上被设计破坏了。虽然他们在匹配过程中做得更好,但基本缺陷仍然存在:

  • Race:当您获得一个PID输出并将其解析回来并用于其他用途时,PID可能已经消失,甚至被一个完全无关的进程所取代
  • 责任:在UNIX进程模型中,管理其子进程是父进程的责任,其他任何人都不应该这样做。如果父级希望能够向其发送信号,并且只有父级能够可靠地这样做,则应保留其子级的PID。UNIX内核的设计假设用户程序将遵循此模式,而不是违反此模式

禁用作业终止消息的另一种方法是将您的命令置于
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"

是的,我知道这一点,这对我来说很好。但我要寻找的是一种压制第二行和第三行信息的方法。谢谢你!是的,我已经做了修改,包括你的建议,把格雷普从杀人清单中删除,但这不是问题的重点。我只是在寻找一种抑制输出的方法,而不是从列表中忽略“grep sleep”。当然,如果这样做,那么您将失去作业控制,因此以后无法执行kill%1或其他操作。我不确定你是否可以逃脱,但在大多数情况下,你可能可以。这些天,如果你进入了一个奇特的工作控制系统,你将使用Perl或其他语言。太好了,这似乎可以做到!我会用我的应用程序研究失去工作控制的影响,但应该没问题。谢谢太好了,谢谢你的链接!我现在正在检查它们,但是您的第一个代码片段没有产生预期的输出(至少在OSX上没有)。第二种方法正如预期的那样工作。@lhunah-我认为
pgrep
/
pkill
是解析
ps
的巧妙替代方法。你能详细说明一下他们的“坏”方面吗?我很欣赏不同方法之间的区别,并对这方面的细节感兴趣。@RubyTuesdayDONO补充道。有人假设你已经知道美元了!参数?不,我不知道,谷歌对它没有帮助。它产生了什么?至少对于Bash4.1.5(1)和Dash0.5.5.1来说,它不起作用:外壳等待睡眠终止