linux ------ 使用 screen 后 SSH 断开后程序依旧能在后台运行

摘要:
为什么ssh断开后你运行的进程会退出呢?找个父进程为1的进程,做为你要后台持续运行进程的父进程。但是如果你的进程需要tty交互,那最好是拿screen、tmux之类的执行。在每个screensession下,所有命令都以ctrl+a(C-a)开始C-ac:创建一个新的运行shell的窗口并切换到该窗口,输入exit回到原来的screensessionC-ad:detach,暂时离开当前session,将目前的screensession丢到后台执行,并会回到还没进screen时的状态,此时在screensession里,每个window内运行的process都在继续执行,即使logout也不影响。

为什么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 将选中的命令调出继续执行。

免责声明:文章转载自《linux ------ 使用 screen 后 SSH 断开后程序依旧能在后台运行》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇任务调度QuartzDesk(Lite Edition)安装部署和使用小结java int与integer的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows和Linux下查看Apache、MySQL、PHP版本

# Windows查看Apache版本: 使用命令:httpd -v # Linux查看Apache版本: 使用命令:apachectl -v # Windows查看MySQL版本: 使用命令:mysql --version # Linux查看MySQL版本: 使用命令:mysql -V # Windows查看PHP版本: 使用命令:php -v...

关于系统用户数,并发用户数,在线用户数,吞吐量

1、  关于系统用户数,并发用户数和在线用户数 系统用户数 侠义上来说,可以理解为系统注册用户数;广义上来说,可以理解为所有访问过系统的用户数 在线用户数 侠义上来说,可以理解为已登录系统的用户数;广义来说,可以理解为当前时间访问系统的用户数。 并发用户数 可以分两种: 1)同一时间点,执行同一(业务)操作的用户数 2)同一时间点,执行不同(业务)操作的...

Shell常用命令之free

前言 free查看当前系统的内存及交换分区使用情况。(写这篇文档是因为一次面试中,面试官问道buff cache你了解吗? 两个月不碰系统突然有些懵。。。你了解什么叫buff/cache吗?) 语法格式 free [options] 选项 -b:以Byte为单位显示内存使用情况 -k:以KB为单位显示内存使用情况 -m:以MB为单位显示内存使用情况 -g:...

linux下IM server搭建

一步一步开始做。 附录: 一套开源协议:http://www.igniterealtime.org/index.jsp Proso:http://prosody.im/ 那谁网友的笔记http://www.cppblog.com/converse/archive/2009/01/13/71902.html 网友的一些观点: msn是用几个不同的服务器分别运...

Linux内核调试方法总结之backtrace

backtrace 【用途】用户态或者内核态程序异常退出时回溯堆栈信息 【原理】通过对当前堆栈的分析,回溯上层函数在当前栈中的帧地址,直至顶层函数。帧地址是指在栈中存在局部变量、上一级函数返回地址、寄存器值的内存空间。由于不同处理器堆栈实现不同(向上增长和向下增长),此功能的具体实现是编译器内建的__buildin_frame_address及__buil...

linux下使用ffmpeg将amr转成mp3

系统环境: CentOS Linux release 8.2.2004 (Core) 1. 首先安装系统编译环境 yum install -y automake autoconf libtool gcc gcc-c++ 2. 编译所需源码包 #yasm:汇编器,新版本的ffmpeg增加了汇编代码 wget http://www.tortall.net/pr...