我想模仿暴力系统关闭,即尽可能接近应用程序级别的停电。我们在谈论Linux上的c / c ++应用程序。 我需要应用程序自行终止。
目前我看到了几个选项:
什么是最佳选择?
部分重复this question
答案 0 :(得分:26)
恕我直言,最接近电力愤怒的是在VM中运行应用程序并在不关闭的情况下为VM供电。在应用程序终止时操作系统仍在运行的所有其他情况下,操作系统将执行某些清理,这在实际停电时不会发生。
答案 1 :(得分:14)
在应用程序级别,你可以得到的最暴力的是_exit()。除以零,段错误等都是信号,可以被捕获 - 如果没有被捕获,它们基本上与_exit()相同,但可能会根据信号留下一个coredump。
如果你真的想要一个硬关机,最好的选择是尽可能以最猛烈的方式切断电源。调用/ sbin / poweroff -fn尽可能接近,尽管它可能会在硬件级别进行一些清理。
如果你真的想要强调一些事情,那么你最好的选择是真正地,真正地削减电力 - 在电源线上安装某种软件控制的继电器,并让软件切断它。不受控制的权力丧失将导致各种怪异的东西。例如,由于RAM losing power before the DMA controller or hard disk,磁盘上的数据可能已损坏。在生产硬件配置中,通过多次试验,除了实际切断功率之外,您无法通过其他任何方式进行测试。
答案 2 :(得分:11)
kill -9
它会终止进程并且不允许任何信号处理程序运行。
答案 3 :(得分:7)
为什么不停下来?或者叫恐慌?
答案 4 :(得分:7)
尝试
raise(SIGKILL)
在此过程中, 或者从命令行:
kill -9 pid
其中pid是你的进程的PID(这两个方法是等价的,不应该执行任何清理)
答案 5 :(得分:5)
您不清楚您的要求是什么。如果您正在测试如何从电源故障中恢复,则需要实际导致电源故障。即使像内核恐慌这样的事情也会允许硬盘上的写缓冲区刷新,因为它们独立于CPU。
如果您确实需要测试完整的故障情况,远程电源板可能是一种解决方案。
答案 6 :(得分:2)
您可以尝试使用虚拟机。 冻结它,拧紧它,看看会发生什么。
否则kill -9将是最好的解决方案。
答案 7 :(得分:2)
如果您需要应用程序自行终止,以下内容似乎合适:
kill(getpid(), SIGKILL); // same as kill -9
如果这不够暴力(可能不是),那么我喜欢终止运行应用程序的VM的想法。您应该可以安装应用程序可以向主机发送命令(通过ssh或其他)来终止自己的VM。
答案 8 :(得分:1)
我已经进行过回归测试,我们曾经将电源开关拨到OFF状态。 在做磁盘IO时。
以后未能恢复,好吧:失败。
您可以购买这样的可靠性:通常您需要“最终用户证书”。
您可以通过与您的UPS通话(脏)来到达软件。 APC UPSes肯定会在软件控制下关闭电源!
谁说系统无法自行循环?
答案 9 :(得分:1)
无限递归,应该耗尽堆栈空间(如果没有,OOM杀手将完成这项工作):
void a() { a(); }
叉炸弹(如果应用程序没有任何分叉限制,那么OOM杀手应该在某个时候杀死应用程序):
while(1)
fork();
内存耗尽:
while(1)
malloc(1);
答案 10 :(得分:1)
在单个运行过程中, kill(getpid(),SIGKILL)是最极端的,因为无法进行清理。
否则,如果您正在进行自动化测试,请尝试使用VM,或将测试机放在电源板上并关闭电源。
答案 11 :(得分:1)
进程以编程方式终止自身的任何解决方案都不会以任何方式模拟异步终止。从某种意义上说它完全是确定性的,它每次都会在代码中的同一点终止。
你的建议
exit()定义为“正常终止,执行常规清理以终止进程。” - 几乎暴力!
_exit()执行exit()操作的某个子集,但对应用程序,操作系统及其资源保持“不错”。
abort()创建一个SIGABRT,操作系统可以选择执行某些资源的清理。
最好不要让应用程序自行终止,但是有一些外部进程异步终止它,以便在执行的任何时候终止。在随机定时器上使用来自其他进程或脚本的kill,以发送无法捕获的SIGKILL信号,并且不执行清理。如果你必须使进程自行终止,那么从某个非确定性时间后唤醒的异步线程中执行它,并终止进程,但即使这样,你也会知道哪个线程在被终止时正在运行。即使使用这些方法,也不可能在中间cpu周期中终止进程,因为实际的断电可能,并且任何缓存或缓冲的数据挂起输出仍可能在进程终止后出现或写入。
答案 12 :(得分:0)
正如所指出的那样,尝试消耗尽可能多的资源,直到内核杀死你:
while(1)
{
malloc(1);
fork();
}
另一种方法是尝试写入只读页面,只需继续写入内存,直到出现总线错误。
如果你可以进入内核,一个杀死它的好方法就是简单地写一个内核使用的数据结构,如果你发现一个页面只能读取并标记为可写,然后覆盖它,则可以获得奖励积分。 BTW大多数Linux内核允许写入syscall_table或中断表,如果你在那里写,你的系统肯定会崩溃。
答案 13 :(得分:0)
在最近的系统上,具有超级用户权限的进程可以获取实时CPU / IO优先级,锁定所有可寻址内存,在/proc
,/dev
,/sys
,LAN / WiFi上喷出垃圾,固件ioctls和闪存同时进行,超频/过载CPU / GPU / RAM,并且很有可能通过使附近的某些内容 Halt and Catch Fire
退出。
如果该流程只需要进行隐喻暴力,则可能会停在/proc/sysrq-trigger
。