1 击杀 -9

1 击杀 -9

设置

我做程序员已经有一段时间了,但对于深层、内部的东西仍然有点模糊。

现在。我很清楚,以下做法都不是好主意:

  1. kill -9 进程(不好)
  2. 自发拔掉正在运行的计算机或服务器的电源插头(更糟糕的是)

但是,有时你就是不得不这么做。有时无论你做什么,进程就是不响应,有时无论你做什么,计算机就是不响应。

我们假设系统通过 mod_wsgi 运行 Apache 2、MySQL 5、PHP 5 和 Python 2.6.5。

注意:我最感兴趣的是 Mac OS X,但与任何 UNIX 系统相关的答案都会对我有所帮助。

我的顾虑

每次我必须执行其中任何一项操作,尤其是第二项操作时,一段时间内我都会非常担心某些东西是否出了问题。某个地方的某个文件可能已损坏——谁知道是哪个文件?计算机上有超过 1,000,000 个文件。

我经常使用 OS X,因此我会通过磁盘实用程序运行“验证磁盘”操作。它不会报告任何问题,但我仍然对此感到担忧。

如果某个配置文件出了问题怎么办?或者更糟的是,某个二进制文件损坏了怎么办?或者某个脚本文件损坏了怎么办?如果某个硬件损坏了怎么办?

如果我直到下个月才发现这个问题,在危急情况下,当损坏或破坏造成灾难时该怎么办?

或者,如果有价值的数据已经丢失怎么办?

我的希望

我希望这些担心和担忧是没有根据的。毕竟,我之前做过很多次了,还没有发生什么真正糟糕的事情。最糟糕的是我不得不修复一些 MySQL 表,但似乎没有丢失任何数据。

但是,如果我的担心不是毫无根据的,并且情况 1 或 2 都可能造成真正的损害,那么我希望有一种方法可以检测并预防它。

我的问题

这可能是因为现代操作系统的设计确保在这些情况下不会丢失任何东西吗?这可能是因为现代软件的设计确保不会丢失任何东西吗?那么现代硬件设计呢?当你拔掉电源插头时,会采取什么措施呢?

我的问题是,对于这两种情况,确切地可能出现的问题以及应采取什么步骤来解决?

我认为可能出错的一件事是某些程序可能没有将其数据刷新到磁盘,因此任何应该写入磁盘的较新的数据(例如,断电前几秒钟)可能会丢失。但除此之外呢?这个 5 秒数据丢失的问题会搞砸系统吗?

那么,在我的硬盘上的海量文件中隐藏的随机文件是否损坏了呢?

那么硬件损坏怎么办?

什么对我最有帮助

  1. 关于当您使用 -9 终止某个进程或关闭整个系统的电源时内部发生的情况的详细描述。(它似乎是瞬间发生的,但是有人可以为我放慢速度吗?)

  2. 对这些场景中可能出错的所有事情的解释,以及(当然是粗略的)概率(即,这种情况不太可能发生,但很有可能)......

  3. 描述现代硬件、操作系统和软件中采取的措施,以防止在这些情况发生时造成损坏或破坏。(安慰我)

  4. 除了“验证磁盘”之外,关于在 kill -9 或 power pull 之后要做什么的说明,以真正确保驱动器上没有任何损坏或损坏。

  5. 可以采取一些措施来强化计算机设置,以便在必须关闭某些设备或切断电源时,可以减轻任何潜在的损害。

  6. 有关二进制文件的一些信息 - Apache 二进制文件或某些库中间可能会有一个或两个随机字节损坏,而这些字节直到稍后才会出现并导致问题,这是真的吗?我如何确保这不是由于断电或终止而发生的?

非常感谢!

答案1

切断电源会导致所有进程毫无预警地停止。 kill -9 对单个进程有同样的效果,会强制终止它终止信号

如果进程因内核或断电而终止,它不会进行任何清理。这意味着您可能会遇到文件写入一半、状态不一致或缓存丢失的情况。由于日志记录、退出状态和电池备份,您通常不必担心这些情况。

如果 /tmp 中的临时文件位于 tmpfs 中,它们将自动消失,但您可能仍有应用程序特定的锁文件需要删除,例如 Firefox 的 lock 和 .parentlock。

大多数软件都足够智能,如果未记录成功退出状态,则会重试交易。典型的邮件系统就是一个很好的例子。如果邮件正在发送,但在中途被切断,则发件人将稍后重试,直到成功为止。

您的文件系统可能已记录日志。如果您正在移动或写入文件,并且它在中途死亡,则已记录日志的文件系统仍将引用原始文件。已记录日志的文件系统将以非破坏性的方式进行更改,保留旧副本,然后仅在回收旧副本在磁盘上占用的空间之前引用新副本作为最后一步。

现在,如果您有一个 RAID 阵列,它有各种内存缓冲区来提高性能并在电源故障时提供可靠性。您的文件系统很可能不知道设备中的缓存及其状态,因此它会认为更改已提交到磁盘,但它仍然在 RAID 缓存的某个地方。那么当电源断电时会发生什么?希望您的 RAID 机箱中有一块功能正常的电池,并且您对其进行了监控。否则,您将有一个损坏的文件系统需要 fsck。

是的,二进制文件中的几个位可能会损坏,但我不会担心现代硬件会出现这么多问题。如果您真的很谨慎,可以使用适当的工具监视磁盘和 RAID 的运行状况,但无论如何您都应该这样做。定期备份并获得不间断电源。

答案2

在意外关机时,唯一应该被损坏的文件是那些以写入方式打开的文件。在大多数系统中,在任何给定时刻,您可能不会写入文件。很有可能。

1 击杀 -9

是 POSIX SIGKILL 并且依赖于实现。接收此信号的进程将没有机会处理它。

1 关闭电源

取决于硬件。磁头在驱动器动量下自动停放,写入缓存中的所有内容都会在几秒钟内失去 DRAM 刷新并衰减为不可挽回的损坏。系统内存、CPU 缓存、寄存器等也会发生同样的情况。

来自 wdc.com(谷歌:site:wdc.com 保护头停车)

断电:硬盘重置。磁头停在着陆区,利用主轴能量。主轴电机停止。

2 - 可能出现的问题

未关闭的文件写出不完整。如果打开文件进行写入,则会出现数据损坏。现代硬件中的文件写入速度很快,现代 PC 通常不会受到 IO 的压力。这就像蒙着眼睛走在一条安静的乡间小路上。大多数时候,你会没事的。

3-对策

请参阅上文了解磁盘的功能。

查看日志文件系统,它们现在正常:http://en.wikipedia.org/wiki/Journaling_file_system

MS Word 或 vi 等软件会将内容写入临时文件而非原始文件。目的是让系统始终处于磁盘上没有一致副本的状态。

Windows 会保留注册表的副本(这太重要了)Wikipedia:“Windows 2000 会保留注册表配置单元(.ALT)的备用副本,并在检测到损坏时尝试切换到该副本”(自 Win2k 以来,我还没有做过重型技术支持,所以我不确定 MS 的新机制是什么)

4 - 该怎么办

按难度排序(易-难)

  • 保留备份
  • 检查你上次正在处理的内容
  • 从单独的磁盘启动并查找上次修改的日期/时间,以查明系统在崩溃时可能正在做什么
  • 从单独的磁盘启动并将所有文件的 md5sum 与离线副本进行比较。

保留备份是最合适的答案,好的备份应该可以让你回到之前修改过的版本。

5

冗余电源?终端用户教育?用胶带和纸板封住电源按钮?

6

除非出现硬件故障、磁盘驱动器损坏、操作系统内核损坏、缺少校验和或升级过程中崩溃,否则二进制文件和库不会以读写方式打开,因此不会被损坏。这种情况确实会发生,但很少见。

答案3

至于 kill -9,这会立即向进程发送一个信号,让其“死亡”。进程会死亡(除非它处于不可中断的睡眠状态,在这种情况下它会变成僵尸进程)。不会关闭任何文件,不会写出任何数据,程序也无法捕获此信号并执行其他操作。没有清理,什么也没有:它只是死亡了。

当今的文件系统非常强大;XFS、JFS、ext3 和 ext4 等都具有日志和其他内容来保持文件系统元数据的完整性。

Apache 本身和其他二进制文件不太可能因为突然断电或系统终止而损坏,因为它们要么在内存中,要么正在被读取;如果它们正在被读取(例如,Apache HTTP 正在启动),则电涌可能会损坏二进制文件,但这似乎不太可能。

我有一台 Mac Mini,人们似乎喜欢冷关机(无论我告诉他们多少次......)但它却继续运行。

在大多数情况下,只要您不依赖 kill -9 或定期关闭电源,我就不会太担心。过去的情况要糟糕得多;我更担心(例如)Solaris 2.6,而不是 Solaris 10(等等)。

答案4

“kill -9”不会同步待处理的 IO 操作。这通常不是问题,但如果系统处于高 IO 负载下,则可能会丢失数据。

这更多的是服务器的问题,其中 RAID 控制器(没有电池支持的缓存)可能会缓存写入并丢失数据。

编辑:还有一件事……如果您依赖网络安装的驱动器并且有打开的文件句柄,则很可能会使文件不一致或损坏。在 Windows 上,您会看到这种情况的典型示例是当用户在共享上安装 Outlook PST 文件并失去电源或网络连接时。

相关内容