Linux nohup守护进程经验

因为我使用xshell,启动jetty,但发现一关闭窗口就自动和主机断开了,和Windows的终端不一样,所以就上网找啊找,网上说普通的一些程序,& 结尾,终端关闭,那么程序也被关!  于是就查为什么ssh一关闭,程序就不再运行了?

如果需要退出终端后依旧在运行,那么可以使用 nohup、screen、setsid。


nohup命令可以用来执行其他命令,并且忽略SIGHUP信号(run a command immune to hangups, with output to a non-tty。Run COMMAND, ignoring hangup signals.)当一个虚拟终端的网络连接断开时,操作系统向正在运行的程序发送SIGHUP信号(HUP = HangUP、挂断),默认情况下这个信号将使程序退出。


 nohup 命令 &

可以在后台运行命令,并且还有nohup.out日志运行文件产生,可以使用tail -f nohup.out来实时监控运行过程。

在Linux/Unix中,有这样几个概念:
进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。



根据POSIX.1定义:
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。


结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

但是为了能够再注销以后 依然能后台运行,那么我们就可以使用nohup这个命令,我们现在开始查找find / -name ‘*http*’ &
,并且希望在后台运行,
那么就使用nohup:nohup find / -name “*httpd*”
此时默认地程序运行的输出信息放到当前文件夹的 nohup.out 文件中去
加不加&并不会影响这个命令   只是让程序 前台或者后台运行而已


简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉。导致一旦ssh关闭,执行中的任务就取消了!!!

你可能感兴趣的:(linux)