Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Process 在Bourne Shell(或csh)中,可以使用什么来产生完全分离的流程_Process_Csh_Sh - Fatal编程技术网

Process 在Bourne Shell(或csh)中,可以使用什么来产生完全分离的流程

Process 在Bourne Shell(或csh)中,可以使用什么来产生完全分离的流程,process,csh,sh,Process,Csh,Sh,我正在测试一种在sh中独立于原始流程运行流程的方法。 我已经问过并且听说&用于生成子进程。 通过调用一个程序,在本例中是glxgears,因为它有很多STDOUT(所以我可以测试输出的位置),使用backticks glxgears& 不将输出保留在当前shell之外,其中 `glxgears`& 原因 comp:~ user$ `glxgears`& [1] 14511 comp:~ user$ X connection to /tmp/launch-dZalNv/

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

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`
出现了吗?外壳从未警告过我其他关闭过程

我想我已经推断出这可能与进程组有关,进程组即使在外壳关闭后仍保持外壳的PID。所有其他流程都有自己的流程组。 甚至使用

`glxgears&`&
将原始shell的PID保留为进程组

我希望能够运行一个程序(在本例中是glxgears),而不需要与启动shell关联,也不需要任何类型的输出

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

尝试以下方法:

nohup glxgears >/dev/null 2>&1 &
  • 2>&1
    使程序的stderr成为stdout
  • /dev/null
    将stdout设置为/dev/null,以便在终端上看不到任何内容,并且如果关闭终端,程序将不会收到boken管道信号
  • 使用
    nohup
    ,如果父程序终止,程序将不会终止
试试这个:

nohup glxgears >/dev/null 2>&1 &
  • 2>&1
    使程序的stderr成为stdout
  • /dev/null
    将stdout设置为/dev/null,以便在终端上看不到任何内容,并且如果关闭终端,程序将不会收到boken管道信号
  • 使用
    nohup
    ,如果父程序终止,程序将不会终止

您似乎混淆了进程与I/O流的关联。后台进程唯一的特殊之处是它们将交互控制返回给调用shell,仅此而已。它们仍然使用同一终端的相同stdout和stderr流。他们还将把输出写到其他什么地方?唯一半合理的做法是(a)完全放弃输出(b)将它们指向某个新文件。这两种行为都被认为不太可能成为默认行为,因此默认行为仍然是使用调用进程的终端进行输出。如arnaud所示,您可以使用
操作符覆盖此选项。

您似乎混淆了进程与I/O流的关联。后台进程唯一的特殊之处是它们将交互控制返回给调用shell,仅此而已。它们仍然使用同一终端的相同stdout和stderr流。他们还将把输出写到其他什么地方?唯一半合理的做法是(a)完全放弃输出(b)将它们指向某个新文件。这两种行为都被认为不太可能成为默认行为,因此默认行为仍然是使用调用进程的终端进行输出。如arnaud所示,您可以使用
操作符覆盖此选项。

如果希望进程完全独立(是
init
进程的子进程),而不是shell进程的子进程,请将整个内容放在括号中<代码>(nohup glxgears>/dev/null 2>&1&)但为什么STDERR/STDOUT仍然转储到父进程shell(据我所知)。你能在不将输出转储到shell的情况下启动它吗?为什么它会在启动shell上输出?stdout是程序写入其正常输出的地方,通常是您的shell。stderr是它输出错误的地方,它也是您的shell。在`
glxgears
`中,您只捕获正常输出,而不是错误。backtics=命令替换,其所需结果是将标准输出“呈现”回父shell,通常用于赋值给变量(和其他用途)。换句话说,将cmd封装在backtics中,或者更好的是$(…),可以按设计工作。代替上面的/DEV/NULL,考虑将完整路径替换为日志/跟踪文件,即/tMP/MyStase/GxxGord.$(/bin /日期+%y%M%D.%H% m)。TraceSlog。祝你好运。@arnaud576875:stdout和stderr通常不是“shell”,它们通常与shell进程自己的stdout和stderr相同。但是在这种情况下,
/dev/null 2>&1
应该将
glxgears
命令的stdout和stdout重定向到
/dev/null
,也就是说,它应该丢弃它们而不是shell进程的子进程<代码>(nohup glxgears>/dev/null 2>&1&)但为什么STDERR/STDOUT仍然转储到父进程shell(据我所知)。你能在不将输出转储到shell的情况下启动它吗?为什么它会在启动shell上输出?stdout是程序写入其正常输出的地方,通常是您的shell。stderr是它输出错误的地方,它也是您的shell。在`
glxgears
`中,您只捕获正常输出,而不是错误。backtics=命令替换,其所需结果是将标准输出“呈现”回父shell,通常用于赋值给变量(和其他用途)。换句话说,将cmd封装在backtics中,或者更好的是$(…),可以按设计工作。代替上面的/DEV/NULL,考虑将完整路径替换为日志/跟踪文件,即/tMP/MyStase/GxxGord.$(/bin /日期+%y%M%D.%H% m)。TraceSlog。祝你好运。@arnaud576875:stdout和stderr通常不是“shell”,它们通常与shell进程自己的stdout和stderr相同。但是在这种情况下,
/dev/null 2>&1
应该重新调用