Screen | Linux远程会话管理
前言
最近在centos7搭建的 rss 服务,总是需要 putty 更新,关掉窗口或者断开连接,这个任务就会被杀掉。没有实现常驻后台,或者开机启动。
相关介绍
为什么关掉窗口/断开连接会使得正在运行的程序死掉?
元凶:SIGHUP 信号
Linux/Unix中,有这样几个概念:
- 进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
- 会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
- 会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
* 挂断信号(SIGHUP)默认的动作是终止程序。
* 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
* 如果会话期首进程终止,则该信号发送到该会话期前台进程组。
* 一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
使用
- 安装Screen
yum install screen
- 在命令行键入
screen
实践上推荐为每个screen会话取一个名字,方便分辨:screen -S name
- Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
在此之后,更以往一样输入 miniflux 启动命令:
export DATABASE_URL="postgres://postgres:password@127.0.0.1/miniflux?sslmode=disable"
export CERT_DOMAIN=your domain name
miniflux
然后关闭putty,miniflux还能照常运行。 - screen启动后,会创建第一个窗口,也就是窗口No. 0。在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序
screen vi david.txt
screen vi test.c
- 我们还可以在一个已有screen会话中创建新的窗口在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。
会话分离与恢复
例如,我们打开一个screen screen vi /tmp/text.txt
之后我们想暂时退出做点别的事情,那么在screen窗口键入C-a d,Screen会给出detached提示:
暂时中断会话
过后,我们可以通过 screen -ls
找到该screen会话,通过 screen -r 12865
重新连接该会话
参考资料
http://blog.sina.com.cn/s/blog_4f8ea2ef0100zosg.html
https://www.cnblogs.com/lpfuture/p/5786843.html
其他
在 install 过程中,出现了 Another app is currently holding the yum lock
,使用kill -9 pid
即可,pid为报错中提到。