当我杀死-9或拉动力量时,究竟会发生什么?

build立

我已经有了一段时间的程序员,但是对于内部深层的东西,我还是有些模糊。

现在。 我清楚地知道,这不是一个好主意:

  1. 杀-9一个进程(坏)
  2. 自发地拉动正在运行的计算机或服务器上的电源插头(更坏)

但是,有时你只是平素而已。 有时候一个程序不pipe你做什么都不会回应,有时候一台电脑不会回应,不pipe你做什么。

假设一个通过mod_wsgi运行Apache 2,MySQL 5,PHP 5和Python 2.6.5的系统。

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

我的顾虑

每次我都要做这两件事,特别是第二件事,我很担心,有一段时间,事情已经被打破了。 有些文件可能会损坏 – 谁知道哪个文件? 计算机上有超过1,000,000个文件。

我经常使用OS X,因此我将通过“磁盘工具”运行“validation磁盘”操作。 它会报告没有问题,但我仍然关心这一点。

如果某个configuration文件被搞砸了怎么办? 或者更糟糕的是,如果某个二进制文件损坏了,该怎么办? 或者某个脚本文件现在已经损坏了。 如果一些硬件损坏了怎么办?

如果直到下个月,在危急的情况下,当腐败或损害导致灾难,我才发现它呢?

或者,如果宝贵的数据已经丢失了呢?

我的希望

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

但是,如果我的担忧不是没有根据的,在1或2的情况下都会发生真正的损害,那么我希望有一种方法来检测它并防止它发生。

我的问题

难道这是因为现代操作系统的devise是为了确保在这些场景中没有任何东西丢失? 难道这是因为现代软件的devise是为了确保没有任何损失? 现代硬件devise呢? 拔电源插头时采取了什么措施?

我的问题是,对于这两种情况, 究竟会出现什么问题,应该采取哪些措施来解决问题?

我的印象是,有一件事情可能会出错,有些程序可能没有将数据刷新到磁盘,所以任何应该写入磁盘的最新数据(比如说,在电源拉开前几秒钟)可能会丢失。 但是除此之外呢? 而这个5秒数据丢失的问题又能搞定一个系统吗?

随机文件的腐败隐藏在我的硬盘驱动器上的大量文件森林中的什么地方?

那硬件损坏呢?

什么会帮助我最

  1. 详细描述当你杀死一个进程或者在整个系统上打开电源时,内部发生的事情。 (这似乎是瞬间的,但是有人可以减慢我的速度吗?)

  2. 在这些情况下所有可能出错的解释,以及(当然是粗略的)可能性(即,这是不太可能的,但是这很可能)…

  3. 对现代硬件,操作系统和软件采取的措施进行说明,以防止发生这些情况时的损坏或损坏。 (安慰我)

  4. 说明在执行kill -9或power pull之后要执行的操作(除了“validation磁盘”之外),以确保没有任何东西在驱动器上的任何地方损坏或损坏。

  5. 可以采取的措施,以加强计算机设置,以便如果必须杀死某些东西或拉动电源,任何潜在的损害都可以减轻。

  6. 关于二进制文件的一些信息 – 是不是真的,Apache的二进制文件或一些库可能有一个或两个随机字节中间损坏,这不会出来,并导致问题,直到以后? 我怎么能向自己保证,这不是由于权力拉扯或杀害的结果?

非常感谢!

拉动力量会导致一切停止在飞行中,没有任何警告。 kill -9在单个进程上具有相同的效果,用SIGKILL强制终止它。

如果某个进程因内核或停电而死亡,则不会进行清理。 这意味着你可能有一半的文件,不一致的状态或丢失的caching。 由于日志logging,退出状态和电池备份,您通常不必担心这些情况。

/ tmp中的临时文件如果在tmpfs中将自动消失,但是您仍然可能需要使用特定于应用程序的locking文件来移除,如locking和Firefox的.parentlock。

如果不logging成功的退出状态,大多数软件都足够聪明,可以重试一个事务。 一个典型的邮件系统就是一个很好的例子。 如果邮件正在传递,但在中间被截断,发件人将稍后重试,直到获得成功。

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

现在,如果你有一个RAIDarrays,它有各种内存缓冲区来提高性能,并提供电源故障的可靠性。 很有可能你的文件系统不会知道设备中的caching及其状态,所以它认为改变已经提交给磁盘,但是它仍然在某处。 那么当电源死亡时会发生什么? 希望你的RAID机箱中有一个function性的电池,并且你可以监控它。 否则,你有一个损坏的文件系统fsck。

是的,一些二进制文件可能会损坏一些,但在现代硬件上我不会担心。 如果你确实是偏执的人,你可以使用适当的工具监视你的磁盘和RAID的健康状况,但是你应该这样做。 定期进行备份并获得不间断电源。

在意外的closures中,唯一应该损坏的文件是可以写入的文件。 在任何时候,在大多数系统上,您可能不会写入文件。 大概。

1杀-9

是POSIX SIGKILL并且依赖于实现。 接收到这个信号的过程将不会被给予处理的机会。

1关机

取决于硬件。 磁头在驱动的动力下自动停放,写入caching中的所有内容都会在几秒钟内失去DRAM刷新并衰减到不可思议的损坏。 系统内存,CPU高速caching,寄存器等也是如此。

从wdc.com(谷歌:网站:wdc.com防护头停车场)

电源丢失:硬盘被重置。 头部使用主轴能量停放在着陆区域。 主轴电机停止。

2 – 有什么可以出错的

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

3 – 对策

请参阅上面的磁盘所做的事情。

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

像MS Word或vi这样的软件将写入临时文件,而不是原始文件。 其目标是永远不要让系统处于磁盘上没有一致拷贝的状态。

Windows保留了registry的副本(这太重要了)维基百科:“Windows 2000保留registryconfiguration单元(.ALT)的备用副本,并在检测到损坏时尝试切换到它”(我没有做过重型技术支持, Win2k,所以我不确定MS的新机制是什么)

4 – 做什么

为了难(难易)

  • 保持备份
  • 检查你最近的工作
  • 从一个单独的磁盘引导,并查找最后修改的date/时间来找出系统在崩溃时可能做了什么
  • 从单独的磁盘启动,并将所有文件的md5sum与脱机副本进行比较。

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

冗余电源? terminal用户教育? 把磁带和纸板放在电源button上?

6

硬件故障,磁盘驱动程序损坏,操作系统内核损坏,在升级过程中缺less校验和或崩溃,二进制文件和库不能以读写方式打开,以免损坏。 它发生,但是很less见。

至于kill -9,这会向进程发送一个信号,当场“死亡”。 死亡的过程(除非它是在不间断的睡眠,在这种情况下,它成为僵尸)。 没有文件被closures,没有数据被写出,程序不能捕获这个信号并做其他事情。 没有清理,没有任何东西:它只是死亡。

现在的文件系统非常强大, 像XFS,JFS,ext3和ext4等都有日志和其他东西来保持文件系统的元数据不变。

像Apache本身和其他的二进制文件不会因为突然断电或系统死机而被破坏,因为它们在内存中或被读取; 如果他们正在读取(例如Apache HTTP正在启动),则可能是电源浪涌会破坏二进制文件,但似乎不太可能。

我有一个Mac Mini的人似乎喜欢closures冷(无论我告诉他们多less次),它只是继续前进。

大部分情况下,只要你不依靠杀人或定时关机,我不会太担心。 过去情况更糟糕。 我比较关心Solaris 10(等等),我更担心(比如)Solaris 2.6。

“kill -9”不会同步未决的IO操作。 这通常不是问题,但是如果系统IO负载过重,则可能会丢失数据。

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

编辑 :另外一件事…如果你依赖于networking安装的驱动器,并有打开的文件句柄,你很可能会离开文件不一致或损坏。 在Windows上,您看到这种情况的经典示例是,用户在共享上挂载Outlook PST文件并失去电源或networking连接。