zoukankan      html  css  js  c++  java
  • linux ------ 使用 screen 后 SSH 断开后程序依旧能在后台运行

    为什么ssh断开后你运行的进程会退出呢?

    因为所有进程都得有个父进程。当你ssh到一个服务器上时,打开的shell就是你所有执行命令的父进程。

    当你断开ssh连接时,你的命令的父进程就没了。如果处理不当,这些进程就会收到SIGTERM信号,全被干掉了。

    然后说解决方案:
    1. 让你运行的进程的父进程变成PID=1的init进程,这样你的shell退出后不影响这些命令的继续执行。方法有很多:第一种,命令执行时按ctrl+z将进程暂停,然后输入bg将进程放到后台(相当于执行命令时加上&)。bg输入完成后会有提示该命令的job ID,然后用disown命令将其父进程ID设置为1。(其实这个时候不需要disown,直接exit退出当前shell,默认此时就会将当前shell所有子进程的父进程设置为1)
    2. 找个父进程为1的进程,做为你要后台持续运行进程的父进程。最简单就是nohup。但是如果你的进程需要tty交互,那最好是拿screen、tmux之类的执行。这样你运行命令的父进程(或祖先进程)是screen、tmux、nohup,你的ssh中的shell退出就不影响命令继续运行了


     

    1、运行.sh文件

    直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令。

    (1)&命令

    加在一个命令的最后,可以把这个命令放在后台执行
    ./abc &

    (2)nohup命令    

    功能:不挂断的运行命令 
    nohup ./abc &

    (3)screen命令

    功能:不挂断的运行命令 
    screen ./bac &
    查看有哪些 screen 在运行
    screen -ls
    
    打印:
    There is a screen on:
                13054.pts-0.cloud            (10/30/18 08:04:59)        (Attached)
    1    socket in /run/screen/s-username
    进入某个screen
    screen -r 13054

    进入某个screen后,ctrl+c关闭screen
    要关闭某个 screen,可以用如下:
    kill ps_ID

    在shell中只输入 screen,会创建一个新的 screen session,session 里面是一个新的 shell。

    在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始(这些命令可以判断是否在screen session里面)

      C-a c :创建一个新的运行shell的窗口并切换到该窗口,输入exit回到原来的screen session

      C-a d :detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。

      C-a t :time,显示当前时间,和系统的 load 

      C-a k :kill window,强行关闭当前的 window

    2、查看当前后台运行的命令

    有两个命令可以用,jobs和ps,区别是jobs用于查看当前终端后台运行的任务,换了终端就看不到了。而ps命令用于查看瞬间进程的动态,可以看到别的终端运行的后台进程。

    (1)jobs命令

            功能:查看当前终端后台运行的任务

           

           jobs -l选项可显示当前终端所有任务的PID,jobs的状态可以是running,stopped,Terminated。+ 号表示当前任务,- 号表示后一个任务。

    (2)ps命令

              功能:查看当前的所有进程

              

             ps -aux | grep "test.sh"    #a:显示所有程序  u:以用户为主的格式来显示   x:显示所有程序,不以终端机来区分

    3、关闭当前后台运行的命令

          kill命令:结束进程

         (1)通过jobs命令查看jobnum,然后执行   kill %jobnum

         (2)通过ps命令查看进程号PID,然后执行  kill %PID

           如果是前台进程的话,直接执行 Ctrl+c 就可以终止了

    4、前后台进程的切换与控制

         (1)fg命令

           功能:将后台中的命令调至前台继续运行

           如果后台中有多个命令,可以先用jobs查看jobnun,然后用 fg %jobnum 将选中的命令调出。

         (2)Ctrl + z 命令

           功能:将一个正在前台执行的命令放到后台,并且处于暂停状态

         (3)bg命令

           功能:将一个在后台暂停的命令,变成在后台继续执行

           如果后台中有多个命令,可以先用jobs查看jobnum,然后用 bg %jobnum 将选中的命令调出继续执行。

     
     
     
     
  • 相关阅读:
    Python:循环语句
    Python:list用法
    ettercap局域网DNS欺骗实现过程
    Linux关于用户信息的一些命令
    业务逻辑漏洞
    Linux安装Sqlmap等工具
    CVE-2015-1635(MS15-034 )进行DOS攻击
    HTTP.SYS远程代码执行漏洞测试(ms15-034)
    爬虫学习笔记
    MSF利用ms17-010漏洞过程记录
  • 原文地址:https://www.cnblogs.com/god-of-death/p/9877500.html
Copyright © 2011-2022 走看看