Screen

安装

  1. yum -y install screen

进程守护命令

  • 创建新的窗口
  1. screen -S 窗口名_xxxx
  • 进入创建的窗口
  1. screen -r 窗口名_xxxx
  • 退出窗口,让进程后台运行:
  1. ctrl + a + d

其他命令

  • 查看窗口
  1. screen -ls
  • 后台运行
  1. ctrl + a + k

kill 窗口

1、使用screen名字,kill掉。
删除一个状态为 detached 的 screen 会话窗口.

  1. screen -S session_name -X quit

2、激活screen

  1. screen -r session_name

并利用exit退出并kiil掉session

nohup

  1. nohup 命令 > log 位置 2&>1 &

使用 &

比如说你远程登录到服务器上,运行一个 Django web 程序:

  1. $ python manager.py runserver 0.0.0.0
  2. Listening on 0.0.0.0:8080...

现在你可以通过服务器的 IP 地址测试 Django 服务,但是终端此时就阻塞了,你输入什么都不响应,除非输入 Ctrl-C 或者 Ctrl-/ 终止 python 进程。
可以在命令之后加一个&符号,这样命令行不会阻塞,可以响应你后续输入的命令,但是如果你退出服务器的登录,就不能访问该网页了。
如果你想在退出服务器之后仍然能够访问 web 服务,应该这样把命令包裹成这样(cmd &):

  1. $ (python manager.py runserver 0.0.0.0 &)
  2. Listening on 0.0.0.0:8080...
  3. $ logout

& 的底层原理

  • 终端执行的程序是 shell 进程的子进程

每一个命令行终端都是一个 shell 进程,你在这个终端里执行的程序实际上都是这个 shell 进程分出来的子进程。

  • 正常情况下shell 会阻塞.

正常情况下,shell 进程会阻塞,等待子进程退出才重新接收你输入的新的命令。

  • & 只是让 shell 不再阻塞.

加上&号,只是让 shell 进程不再阻塞,可以继续响应你的新命令。但是无论如何,你如果关掉了这个 shell 命令行端口,依附于它的所有子进程都会退出。

  • (cmd &) 把 cmd 命令挂载到 systemd 下.

而(cmd &)这样运行命令,则是将cmd命令挂到一个systemd系统守护进程名下,认systemd做爸爸,这样当你退出当前终端时,对于刚才的cmd命令就完全没有影响了。

类似的,还有一种后台运行常用的做法是这样:

  1. $ nohup some_cmd &

nohup命令也是类似的原理,不过通过我的测试,还是(cmd &)这种形式更加稳定。