Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2415333
  • 博文数量: 384
  • 博客积分: 10193
  • 博客等级: 上将
  • 技术积分: 3785
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-09 18:02
文章分类

全部博文(384)

文章存档

2011年(10)

2010年(29)

2009年(39)

2008年(36)

2007年(43)

2006年(198)

2005年(29)

分类: LINUX

2009-10-20 11:58:51

在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即可正常退出.

阅读(3059) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~