重定向stdout& stderr从后台进程

时间:2010-11-28 18:05:35

标签: linux bash time background stderr

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

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

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

foo & 
exit

当我回来时,a.exe已执行但时间统计信息未出现在我的日志文件中。有人知道为什么吗?在我关闭父shell之后有没有办法获取时序统计信息?

感谢

5 个答案:

答案 0 :(得分:5)

nohup foo &

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

  

NAME

     

nohup - 调用免于挂断的命令

     

概要

nohup utility [arg ...]
     

描述

     

nohup 实用程序调用带有参数的命令,此时设置要忽略的信号SIGHUP。如果标准输出是终端,则标准输出将附加到当前目录中的nohup.out文件中。如果标准错误是终端,则它将指向与标准输出相同的位置。

答案 1 :(得分:2)

由于问题也被标记为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

答案 2 :(得分:0)

尝试:

nohup <your_command> &

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

John给出了一个更好的答案 - 使用nohup。