当使用 ssh远程登录 Linux终端的时候,这个终端以及在这个终端开启的所有进程都是在 一个 Session中,终端就是这个会话的会话头,一旦终端被杀死(比如说网络掉线或者主动退出等),这个会话里面的所有进程组和进程都会收到 hangup信号,全部被杀死。 如果我们的程序在终端上正在运行,那么这个时候可能就要喊出***了,因为我们的程序就这样随着终端结束的时候被杀死了。一些运行时间短的程序还好说,如果是运行了很久的程序在等待结果,那么就会对我们造成巨大的损失,那么如何避免这样的事情发生呢? 下面我们就介绍比较常用的3种方式。 如果想要在终端开启的任务不随着终端的死亡而死亡,如果使用 &,是不行的,终端被杀死的时候,进程仍然会被杀死。需要这样做: 1.使用 nohup命令 nohup ***,这个 ***任务就不会跟随会话的死亡而死亡了,但是这样没有程序的打印信息; 2.setsid *** 这样,***任务仍然会打印信息而且不随 终端的死亡而死亡。setsid相当于 离开了原来的会话组,自己创建了一个会话组并且是会话组头领,所以不会随着 终端的死亡而死亡(因为终端死亡的时候不会给 ***进程发送 hangup信号)。 3.使用虚拟screen 目前这个是最好的方法,即使掉线之后,也可以使用 screen -r命令将虚拟screen重新调出来,查看打印信息。唯一不方便的地方就是 需要手动安装这个软件。不过手动安装也不困难,yum install screen即可。 下面我们着重说一下格外强大的 screen中常用的命令: screen 开启一个screen终端 screen -ls 查看开启了那些screen终端 screeen -r 15880 恢复到指定的终端(如果只有一个screen 可以不用指定-r的参数) screen -wipe 擦除已经死掉的screen 在screen中的时候,ctrl+a+d直接退回到打开 screen的终端,可以使用 kill -9 15880来杀死想要关闭的 screen。 |