Screen
安装
yum -y install screen
进程守护命令
- 创建新的窗口
screen -S 窗口名_xxxx
- 进入创建的窗口
screen -r 窗口名_xxxx
- 退出窗口,让进程后台运行:
ctrl + a + d
其他命令
- 查看窗口
screen -ls
- 后台运行
ctrl + a + k
kill 窗口
1、使用screen名字,kill掉。
删除一个状态为 detached
的 screen 会话窗口.
screen -S session_name -X quit
2、激活screen
screen -r session_name
并利用exit退出并kiil掉session
nohup
nohup 命令 > log 位置 2&>1 &
使用 &
比如说你远程登录到服务器上,运行一个 Django web 程序:
$ python manager.py runserver 0.0.0.0
Listening on 0.0.0.0:8080...
现在你可以通过服务器的 IP 地址测试 Django 服务,但是终端此时就阻塞了,你输入什么都不响应,除非输入 Ctrl-C 或者 Ctrl-/ 终止 python 进程。
可以在命令之后加一个&符号,这样命令行不会阻塞,可以响应你后续输入的命令,但是如果你退出服务器的登录,就不能访问该网页了。
如果你想在退出服务器之后仍然能够访问 web 服务,应该这样把命令包裹成这样(cmd &):
$ (python manager.py runserver 0.0.0.0 &)
Listening on 0.0.0.0:8080...
$ logout
&
的底层原理
- 终端执行的程序是 shell 进程的子进程
每一个命令行终端都是一个 shell 进程,你在这个终端里执行的程序实际上都是这个 shell 进程分出来的子进程。
- 正常情况下shell 会阻塞.
正常情况下,shell 进程会阻塞,等待子进程退出才重新接收你输入的新的命令。
&
只是让 shell 不再阻塞.
加上&号,只是让 shell 进程不再阻塞,可以继续响应你的新命令。但是无论如何,你如果关掉了这个 shell 命令行端口,依附于它的所有子进程都会退出。
(cmd &)
把 cmd 命令挂载到systemd
下.
而(cmd &)这样运行命令,则是将cmd命令挂到一个systemd系统守护进程名下,认systemd做爸爸,这样当你退出当前终端时,对于刚才的cmd命令就完全没有影响了。
类似的,还有一种后台运行常用的做法是这样:
$ nohup some_cmd &
nohup命令也是类似的原理,不过通过我的测试,还是(cmd &)这种形式更加稳定。