Answers:
当您关闭终端窗口时,终端仿真器会将SIGHUP发送到它正在运行的进程,即Shell。然后,您的shell将SIGHUP转发到它正在运行的所有内容。在您的本地系统上,这是ssh。然后,ssh将SIGHUP转发到它正在运行的远程外壳。因此,您的远程外壳程序随后将SIGHUP发送到其所有进程,即后台程序。
有两种解决方法。
disown
进程后台运行后,使用该命令。这会使外壳忘记它。nohup
(nohup $python program.py &
)。这可以完成相同的操作,但是要使用中间过程。基本上,它会忽略SIGHUP信号,然后派生并执行继承设置的程序,然后退出。因为它是分叉的,所以启动的程序不是外壳程序的子级,外壳程序也不知道它。除非它为SIGHUP安装了信号处理程序,否则它将始终保持忽略操作。logout
而不是关闭终端窗口。使用时logout
,这不是SIGHUP,因此外壳程序不会将SIGHUP发送给它的任何子级。另外,您必须确保您的程序不会通过STDOUT或STDERR写入终端,因为一旦终端退出,这两个都将不再存在。如果你不把它们重新导向到像/dev/null
,该程序将继续运行,但如果它试图对其进行写操作,它会得到一个SIGPIPE和SIGPIPE的默认动作是终止进程)。
ssh
染色会导致连接断开,连接下降会导致sshd
另一端死亡。该sshd控制着远程外壳运行的伪终端的主端,当它死亡时,这是一个挂断(就像拔掉真实终端上的插头一样),因此系统将SIGHUP发送到远程外壳。
nohup
该nohup.out
文件将生成一个文件,其中包含您以该文件开头的程序的输出。每次使用nohup以这种方式启动应用程序时,删除该文件可能会很烦人(否则您需要将其输出重定向到/dev/null
)。
nohup python program.py &
我建议您使用setsid python program.py
替代方法,它会立即使程序放弃。
在以&符号(&
)结尾的命令之后,在命令提示符处运行命令bg
:
bash> python program.py &
bash> bg
这会将“&”命令置于后台
bash> jobs
这将列出在后台运行的作业
bash> fg 1
这将把工作1带到前台
另一种方法,(能够注销)
bash> at now
bash> /full/path/python /full/path/program.py
bash> ^d `(# That is, Control-D, to run the command, Control-C to cancel)`
多行可被提交给at
所述^ d之前命令,(控制-d)
看到man at
。