nohup.out 文件的产生

某台主机 / 大小是 20G,被一个叫 nohup.out 的文件占了 12G,G 了一下,发现其实是一个 stdout/stderr 文件。
简单的讲,一般 ssh 执行某个任务的时候,正常退出后,系统分配给该次登录的 session 会被 SIGHUP(1) 进程给杀死,其运行的进程也会被杀死。如果不想结束该进程,比如你想长期在后台运行某个任务,可以通过 nohup 这个命令来解决。

正常情况下,ssh 后执行 nohup 会将 stdout 至 nohup.out 文件,这也就是为什么那个文件会有 12G 的大小的原因了。当然你也可以指定输出的文件:

$ nohup ./myprogram > foo.out 2> foo.err < /dev/null &

做了个小实验,在终端 pts/5 上:

# cat nohup.sh
#!/bin/bash
while true
do
echo $(date) >> nh
sleep 2
done

# ./hohup.sh

在终端 pts/11 上:

# tail -f nh
2012年 01月 22日 星期日 15:44:59 CST
2012年 01月 22日 星期日 15:45:01 CST
2012年 01月 22日 星期日 15:45:03 CST

2012年 01月 22日 星期日 15:45:15 CST
2012年 01月 22日 星期日 15:45:17 CST

在另外一个中断上执行如下命令,强行关闭 A:

# w
 15:53:06 up 80 days,  4:49,  4 users,  load average: 0.19, 0.40, 0.37
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/10   x.x.x.x              15:48    0.00s  0.01s  0.00s w
root     pts/11   x.x.x.x              15:40    2:01   0.04s  0.00s tail -f nh
root     pts/4     x.x.x.x               15:24   27:08   0.02s  0.02s -bash
root     pts/5     x.x.x.x               15:49    3.00s  0.01s  0.00s /bin/bash ./nohup.sh

# ps axu | grep pts/5
root     17705  0.0  0.0  90108  3336 ?        Ss   15:49   0:00 sshd: root@pts/5
root     17709  0.0  0.0  66088  1520 pts/5    Ss   15:49   0:00 -bash
root     17831  0.0  0.0  63860  1100 pts/5    S+   15:53   0:00 /bin/bash ./nohup.sh
root     17865  0.0  0.0  58916   500 pts/5    S+   15:53   0:00 sleep 2
root     17867  0.0  0.0  61176   732 pts/10   S+   15:53   0:00 grep pts/5

# kill 17705
当然直接按 Shift+Alt+c(Awesome) 也是可以关闭的。

现在发现 tail 没有内容了。现在 ssh 到那台主机,pts/5,重新执行:

# nohup  ./nohup.sh
nohup: appending output to “nohup.out”

pts/11 的 tail 又开始出内容了,现在像上面那样关闭 pts/5,pts/11 上的 tail 仍然有内容输出,可见 nohup 的作用了。

一般在执行 nohup 的时候,可以再最后加个 "&",也就是背景执行,这样当前的该终端就不会被占用。

自从有了 screen/tmux 之后,就没有必要使用 nohup 这么古老的东西了。

ref:

http://en.wikipedia.org/wiki/Nohup

  • momognu

    m/