nohup: 让程序连续运行

3050阅读 0评论2009-10-20 blue_stone
分类:LINUX

在Linux/Unix系统中, 要想保证一个程序能够在登录shell退出或中断后继续运行, 标准的方法就是使用nohup. 比如需要执行的任务未foo, 则使用的nohup命令为:

nohup foo

默认情况下, 程序的输出会被保存到nohup.out文件中. 如果该命令需要跟一些参数, 将参数依次写在命令后边即可.

nohup并不改变程序的运行方式, 如果需要默认不在后台运行的程序后台运行, 可在整个命令后加"&"

一切都应该运行的很好. 如果是通过网络ssh或telnet到服务器, 并使用nohup执行命令, 当ssh/telnet窗口关闭, 或网络中断, 或者客户机崩溃,再次连接到服务器,会发现,你期望仍在运行的程序已经消失的无影无踪了.这是由于这些异常发生后,服务器会清除登录shell的所有子进程,释放这些进程占用的资源.而后台执行的进程同样是登录shell的子进程:

 2927 ?        Ss     0:00 /usr/sbin/sshd
 2934 ?        Ss     0:00  \_ sshd: liang [priv]
 2944 ?        S      0:00      \_ sshd: liang@pts/3
 2945 pts/3    Ss+    0:00          \_ -bash
 3003 pts/3    S      0:00              \_ tail -f game.asc


以上是我ssh到一台机器上运行"nohup tail -f game.asc &", 后使用ps 查看进程的结果, 结果显示tail进程是bash的子进程. 使用kill -9 杀死konsole窗口后, tail进程随之消失.

如希望网络和客户端的异常尽可能不影响进程的运行, 则可以在使用nohup启动进程后, 正常退出系统,这样新启动的进程父进程将变更为1, 也就是init进程. 在aix系统中, 退出时会提示there are running jobs, 可不予理会, 再次运行exit即可正常退出.

上一篇:升级至grub2
下一篇:钱学森先生辞世 又一位大师远去