从后台进程redirectstdout&stderr

我有一个名为foo的脚本运行程序a.exe,并将计时统计信息发送到文件time.log

#!/bin/bash date 1>> time.log (time ./a.exe) 2>> time.log 

如果我在terminal的后台运行脚本,并保持我的shell打开,直到a.exe完成,但如果我在后台运行脚本并退出我的terminal(a.exe需要很长时间才能运行)

 foo & exit 

当我回来,a.exe已经执行,但时间统计信息不会出现在我的日志文件。 有人知道为什么吗? 是否有一种方法可以在closures父shell之后获取计时统计信息?

谢谢

Solutions Collecting From Web of "从后台进程redirectstdout&stderr"

 nohup foo & 

当你退出你的shell时,它会向所有的子进程发送一个SIGHUP信号,默认情况下会杀死它们。 如果你想要一个进程继续执行,即使当父shell退出,那么你需要让它忽略SIGHUP。

名称

nohup – 调用一个免于hangups的命令

概要

 nohup utility [arg ...] 

描述

nohup实用程序使用其参数调用命令,此时将信号SIGHUP设置为忽略。 如果标准输出是终端,则标准输出将附加到当前目录下的nohup.out文件中。 如果标准错误是一个终端,它被定向到与标准输出相同的地方。

由于这个问题也被标记为bash ,所以我引用了man bash

 disown [-ar] [-h] [jobspec ...] Without options, each jobspec is removed from the table of active jobs. If jobspec is not present, and neither -a nor -r is supplied, the shell's notion of the current job is used. If the -h option is given, each jobspec is not removed from the ta‐ ble, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If no jobspec is present, and neither the -a nor the -r option is supplied, the current job is used. If no jobspec is supplied, the -a option means to remove or mark all jobs; the -r option without a jobspec argument restricts operation to running jobs. The return value is 0 unless a job‐ spec does not specify a valid job. 

当你开始工作时,这会派上用场,但忘记用nohup来加上前缀。 做就是了

 disown -ah disown -a 

不要忘记删除所有对tty / pts的引用,0 </ dev / null删除stdin引用。

当您关闭父shell时,您的a.exe将被终止。

您可以键入屏幕,照常运行命令并退出屏幕。 当父shell退出时,这样可以避免进程被终止。 这种方法有点麻烦,但在其他情况下可能会很方便。

约翰给了一个更好的答案 – 使用nohup。

尝试:

 nohup <your_command> &