什么可以用于在Bourne Shell中生成一个完全独立的进程(或者csh)

时间:2011-08-21 18:24:58

标签: process csh sh

我正在测试一种在sh中独立于原始进程运行进程的方法。 我已经问过并听说过&用于生成子进程。 通过调用一个程序,在这种情况下是glxgears,因为它有很多STDOUT(因此我可以测试输出的位置),使用反引号。

glxgears&

不会将输出保持在当前shell

之外
`glxgears`&

原因

comp:~ user$ `glxgears`&
[1] 14511
comp:~ user$ X connection to /tmp/launch-dZalNv/org.x:0 broken (explicit kill or server shutdown).

[1]+  Exit 1                  `glxgears`
comp:~ user$

我接受 [1] 14511 只是正确启动流程的通知,但X服务器仍然能够在我的shell中转储输出? 如果我已经启动了一个单独的流程,为什么

[1]+  Exit 1                  `glxgears`

出现? shell永远不会警告我其他关闭过程!

我想我已经推断出它可能与进程组有关,即使我的shell关闭后仍然是我的shell的PID。所有其他进程都有自己的进程组。 即使使用

`glxgears&`&

将原始shell的PID保留为进程组!

我希望能够运行一个程序(在这种情况下是glxgears)而不与启动shell有任何关联,没有任何输出。

如果您还可以解释为什么X服务器可以向我的启动过程发送非常感谢的输出。

2 个答案:

答案 0 :(得分:3)

试试这个:

nohup glxgears >/dev/null 2>&1 &
  • 2>&1使程序的stderr成为stdout。
  • >/dev/null使stdout成为/ dev / null,这样你终端上什么也看不到,如果你关闭你的终端,程序将不会收到管道信号
  • 使用nohup,如果其父级终止,程序将不会终止

答案 1 :(得分:1)

您似乎混淆了与I / O流的进程关联。背景过程唯一特别之处在于它们将交互式控制返回给调用shell,仅此而已。他们仍然使用相同终端的相同stdout和stderr流。他们还在哪里写输出?唯一的半合理的事情是(a)完全丢弃输出(b)将它们指向一些新文件。两者都被认为不太可能成为默认行为,因此默认仍然是使用调用进程的终端进行输出。您可以使用>运算符覆盖此选项,如arnaud所示。