假设此命令从 MacOS 终端命令行调用一个应用程序:
/Applications/Matlab_R2020a.app/bin/matlab
然后终端不再能够接受命令,MATLAB 是依赖的(即如果终端控制台关闭,MATLAB 将终止)。这种依赖关系叫什么?如何启动应用程序才能使其“独立”?也就是说,关闭终端不会关闭应用程序?
假设此命令从 MacOS 终端命令行调用一个应用程序:
/Applications/Matlab_R2020a.app/bin/matlab
然后终端不再能够接受命令,MATLAB 是依赖的(即如果终端控制台关闭,MATLAB 将终止)。这种依赖关系叫什么?如何启动应用程序才能使其“独立”?也就是说,关闭终端不会关闭应用程序?
依赖关系将会作为您的 shell 的子进程
matlab
而产生,而该子进程又是您的终端仿真器应用程序的子进程。现在,这并不是
matlab
当你的 shell 退出/终止时退出的原因。shell 本身有一个钩子,它会注意到它即将结束,并会
SIGHUP
向它生成的进程发送一个“挂断”(如挂断电话)信号。除非您的进程(即matlab
)本身已为该信号安装了特定的处理程序来停止该信号,或者明确表示它将忽略该信号,否则它将退出。matlab
因此,和你的 shell之间的关系是父母的关系,但退出 matlab 是 shell 的明确干预。Romeo 的答案展示了如何规避这种情况:
matlab
您可以启动nohup
程序,而不是启动程序,这本身并没有做太多事情 - 它只声明自己忽略挂断信号,并启动您指定为参数的程序,替换自身。 (如果需要,它还可以弯曲标准输入和输出。)要运行命令并将其从终端分离,通常的 UNIX/Linux 做法是使用类似以下命令:
nohup
从终端上断开连接&
将其置于背景中(当然
<command>
用你的命令名称替换,例如/Applications/Matlab_R2020a.app/bin/matlab
)构造将程序的输出
>out_log
存储在文件中,并发送到 STDOUT。构造将程序的输出存储在文件中,并发送到 STDERR。保留此信息并将其存储在单独的文件中以备需要进行调试、调查等时使用是一种很好的做法。out_log
2>err_log
err_log