7

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

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

如果我在终端后台运行脚本并保持外壳打开直到 a.exe 完成,则此方法有效,但如果我在后台运行脚本并退出终端(a.exe 需要很长时间才能运行)

foo & 
exit

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

谢谢

4

5 回答 5

7
nohup foo &

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

姓名

nohup -- 调用一个不受挂断影响的命令

概要

nohup utility [arg ...]

描述

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

于 2010-11-28T18:08:53.087 回答
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
于 2010-11-28T18:27:33.980 回答
0

尝试:

nohup <your_command> &
于 2010-11-28T18:08:54.953 回答
0

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

于 2010-11-28T18:09:10.070 回答
0

当您关闭父 shell 时,您的 a.exe 会被杀死。

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

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

于 2010-12-10T09:27:20.603 回答