假设我使用 停止一个进程,Ctrl+Z
并在五个小时后使用 恢复它fg
。这对于进程的正常运行有多大风险?
例如,假设vim
正在将一个大文件写入磁盘,而我在写入过程中停止了写入。vim
当我恢复写入时,它会顺利地完成写入,没有任何问题吗?在极端情况下,如果我在此期间删除了该文件会发生什么?我最终会破坏文件系统吗?(删除停止vim
写入的文件是否可能,或者文件系统驱动程序会阻止我删除文件,直到vim
写入完成?)
vim
显然是一个相对简单的软件,仅仅是一个文本编辑器。我是否可以停止并恢复诸如apache
或之类的复杂软件X11
,而不会出现太多问题(对于 Apache 来说,客户端超时除外)?
答案1
从本质上来说,Ctrl-Z 并不危险。你不应该害怕它。
具体会发生什么取决于进程正在做什么。您的示例值得考虑。
首先,vim 写入文件时...不会发生任何不好的事情。如果在恢复 vim 时仍有磁盘空间,它将完成写入文件。如果在 vim 暂停时将其终止,则文件将被截断,并保留暂停前写入的数据(就您而言)。如果在 vim 暂停时删除文件,则 vim 基本上会在需要时继续查看该文件。从 vim 外部看,该文件将被视为已删除,但 vim 仍将看到它,直到它完成写入并关闭它,此时它将消失。(如果 vim 尝试重新打开它,它将消失。)习惯了最后一种行为后,当 Windows 锁定文件时,您会觉得自己在使用一个愚蠢的玩具。
您的第二个示例可能会导致问题。如果有其他进程与您的进程交互,它们都会因为等待此应用程序而卡住。因此,是的,会发生客户端超时,某些进程可能会无限期地阻塞以等待读取数据等。但仍然不会发生真正“糟糕”的事情。除非某处有错误,否则不会发生任何会损坏系统的事情。(例如,编写不当的应用程序无法处理超时,因此会放弃并丢失所有数据……但这不是您暂停的应用程序的错。)
Apache 显然会停止提供网页服务。X11 会停止推送像素。但通常当您重新启动它时,阻塞的事情会恢复,如果客户端超时,如果您重新启动它们,它们也会再次正常工作。
答案2
Unix 是一个分时操作系统,因此程序无论如何都不会独占 CPU,它们会与其他程序和操作系统本身共享 CPU。暂停程序时,您只会将时间延迟到下一个执行周期。根据程序的不同(例如,如果它是时间敏感的,如网络或视频播放软件),您可能会遇到超时,但基本上不会发生任何不好的事情。
至于关于在程序仍在“运行”时删除文件的第二个问题,请参阅问题“rm 何时删除打开的文件?”。
答案3
基本上,这取决于程序。vim(1)(或与六(1))你甚至可以杀死它,你将有可能恢复到杀死那一刻的文件而不会丢失数据,即使整个系统崩溃了(看看六(1)/vim(1)手册页
一般来说,停止一个程序五个小时可能会产生一些副作用,可能会破坏你正在做的事情。
假设你打开的程序是一个网络客户端(例如SSH(1)会话到另一台机器)通常,服务器会激活一个称为保持活动状态即使您没有任何内容要说,也可以保持连接处于活动状态。在这种情况下,这不会造成任何影响,因为内核具有打开的 TCP 连接,可以代表已停止的进程创建 KEEPALIVE(tcp 连接是内核资源,而不是用户空间进程资源),您可以无限期地保持进程停止。
但是,如果服务器尝试发送一些数据而客户端没有确认,会发生什么情况呢?如果客户端长时间没有回复任何消息(或者服务器填满了发往客户端的所有数据缓冲区并且无法阻塞),应用程序协议可能会设置超时来断开连接。在这种情况下,您将看到客户端尝试使用已断开的连接(服务器已断开)。
所以这个问题的答案是:一般来说没有问题,但这完全取决于停止的程序对其环境的需求(它处于休眠状态,但世界仍在继续旋转)