我正在测试一种在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服务器可以向我的启动过程发送非常感谢的输出。
答案 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所示。