在没有正确退出应用程序的情况下关闭终端窗口是否有害?

Fix*_*int 18 command-line shell terminal

使用 Ubuntu 12.04 LTS,我的问题是,如果我在终端窗口中启动了一个应用程序,那么在没有先正确退出应用程序的情况下关闭终端窗口有什么不好的地方。例如,我使用 MATLAB。我打开一个终端并输入

matlab -nodisplay -nodesktop -nosplash
Run Code Online (Sandbox Code Playgroud)

然后运行一堆脚本。那我也可以

exit
Run Code Online (Sandbox Code Playgroud)

结束 MATLAB,然后关闭终端窗口或仅关闭终端窗口。这两种方法之间的真正区别是什么?第二种方法是否以某种方式“伤害”了任何东西?第一种方法是首选吗?为什么?

slm*_*slm 23

一般来说,这样做应该没问题。

当您单击“X”关闭终端窗口时,即从您的桌面(GNOME、KDE ​​等)向终端应用程序发送“信号”,告诉它自行关闭。由于您在此 shell 中运行 MATLAB,因此它被视为终端应用程序的子进程。

因此,作为父进程的一部分责任是,您反过来向您的孩子发送相同的关闭“信号”。

现在,如果您从概念上理解了我刚刚解释的内容,那么让我们用更多真正的术语来代替。

信号

首先是“信号”,实际上有一整套不同的信号可以发送到 Unix 进程。为了保持它的简单有4个,你会经常看到,SIGHUPSIGTERMSIGINT,和SIGKILL

  • 签到

    SIGHUP 信号在其控制终端关闭时发送到进程。它最初设计用于通知串行线路掉线的过程。在现代系统中,这个信号通常意味着控制伪或虚拟终端已经关闭。

  • SIGTERM

    SIGTERM 信号是用于导致程序终止的通用信号。与 SIGKILL 不同的是,这个信号可以被阻塞、处理和忽略。这是礼貌地要求程序终止的正常方式。

  • 信号情报

    SIGINT(“程序中断”)信号在用户输入 INTR 字符(通常为 Cc)时发送。

  • SIGKILL

    SIGKILL 信号用于立即终止程序。它无法处理或忽略,因此总是致命的。也无法阻止此信号。

注意: SIGINT是当您使用Ctrl+C从命令行“中断”正在运行的程序时发送的内容。

哪个正在使用?

很可能SIGTERM正在被您的窗口环境调用并传递到您的终端。然后,您的终端很可能会发送SIGHUP到 MATLAB。该信号使所有进程有机会自己进行任何本地清理(关闭文件、结束进程等)。

杀死命令

您可以使用名称不佳的命令自己发送信号,kill. 因此,要将SIGTERM信号发送到您的终端或SIGHUP to MATLAB, you could determine their PID usingps`,然后运行此命令向它们发送信号:

$ kill -SIGTERM <PID>
Run Code Online (Sandbox Code Playgroud)

或这个:

$ kill -SIGHUP <PID>
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令获取信号的完整列表:

$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...
...
Run Code Online (Sandbox Code Playgroud)

注意到信号有数字了吗?你会经常看到他们这样使用而不是他们的名字:

$ kill -15 <PID>
Run Code Online (Sandbox Code Playgroud)

或者臭名昭著的-9,它几乎可以杀死任何进程。