我有一个名为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之后有没有办法获取时序统计信息?
感谢
答案 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。