一般我们登陆到服务器之后比如说运行一个 Django web 程序:

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

如果我们退出命令行,那么便关闭了该程序,如果我们希望他后台运行的话,那么直接在命令后面增加 & 即可。

1
$> python manager.py runserver 0.0.0.0 &

但是这样的话仅仅是不阻塞当前的命令行,如果命令行退出,程序依然关闭。这是由于这个新的进程是 shell 分出来的子进程,所以如果当 shell 关闭,那么子进程也便结束了。解决这个问题的方案有两个分别是 $> (<$cmd> &)$> nohub <$cmd> &。他们的原理是将 cmd 命令挂到 systemd 系统守护进程名下,认 systemd 作为父进程,这样当终端退出的时候,便对 cmd 命令完全没有影响。

1
2
3
4
5
6
7
# 命令的格式
$> (<$cmd> &)
$> nohub <$cmd> &

# 以上面的例子来举例
$> (python manager.py runserver 0.0.0.0 &)
$> nohub python manager.py runserver 0.0.0.0 &

参考文章

  1. 关于 Linux shell 你必须知道的