使用 Ubuntu 12.04 LTS,我的问题是,如果我在终端窗口中启动应用程序,那么直接关闭终端窗口而不先正确退出应用程序有什么不好的吗?例如,我使用 MATLAB。我打开一个终端并输入
matlab -nodisplay -nodesktop -nosplash
然后运行一堆脚本。那么我可以
exit
结束 MATLAB,然后关闭终端窗口或仅关闭终端窗口。这两种方法之间到底有什么区别?第二种方法是否会“伤害”任何东西?第一种方法是首选吗?为什么?
答案1
一般来说,这样做应该没问题。
当您单击“X”关闭终端窗口时,即从桌面(GNOME、KDE 等)向终端应用程序发送一个“信号”,告诉它自行关闭。由于您在此 shell 中运行 MATLAB,因此它被视为终端应用程序的子进程。
因此,作为父进程的部分责任是,您反过来向您的子进程发送同样的关闭“信号”。
现在,如果您从概念上理解了我刚才解释的内容,那么让我们用更多的实际术语来代替。
信号
首先是“信号”,其实有一个整个系列的不同信号您可以将其发送到 Unix 进程。为了简单起见,有 4 个您经常看到的:SIGHUP
、SIGTERM
、SIGINT
和SIGKILL
。
叹息
当进程的控制终端关闭时,SIGHUP 信号被发送到进程。它最初的设计目的是通知串行线路掉线的进程。在现代系统中,该信号通常意味着控制伪或虚拟终端已关闭。
信号术语
SIGTERM 信号是用于导致程序终止的通用信号。与 SIGKILL 不同,该信号可以被阻止、处理和忽略。这是礼貌地要求程序终止的正常方式。
信号情报
当用户键入 INTR 字符(通常为 Cc)时,会发送 SIGINT(“程序中断”)信号。
信号杀死
SIGKILL 信号用于导致程序立即终止。它无法处理或忽略,因此总是致命的。也不可能阻止该信号。
笔记: SIGINT
是当您在程序运行过程中使用Ctrl+从命令行“中断”程序时发送的内容。C
哪一个正在被使用?
最有可能的是,它SIGTERM
被您的窗口环境调用并传递到您的终端。您的终端很可能会发送SIGHUP
至 MATLAB。该信号使所有进程都有机会自行进行任何本地清理(关闭文件、结束进程等)。
杀死命令
您可以使用名称不佳的命令自行发送信号kill
。因此,要将SIGTERM
信号发送到您的终端或SIGHUP to MATLAB, you could determine their PID using
ps`,然后运行此命令向它们发送信号:
$ kill -SIGTERM <PID>
或这个:
$ kill -SIGHUP <PID>
您可以使用以下命令获取完整的信号列表:
$ 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
...
...
注意到信号有数字吗?你经常会看到他们这样使用而不是他们的名字:
$ kill -15 <PID>
或者臭名昭著的-9
,它几乎可以杀死任何进程。
答案2
这很可能没问题,但您会丢失数据,具体取决于您打开的应用程序。例如,如果您打开了文件编辑器,如果未正确保存并退出,则可能会丢失一些更改。如果您担心,只需正确注销/退出终端即可。如果您不喜欢打字exit
或logout
只是尝试Ctrl-D
。