在Linux/Unix系统中, 要想保证一个程序能够在登录shell退出或中断后继续运行, 标准的方法就是使用nohup. 比如需要执行的任务未foo, 则使用的nohup命令为:
默认情况下, 程序的输出会被保存到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即可正常退出.
阅读(3069) | 评论(0) | 转发(0) |