Что является самым сильным способом, которым приложение может завершиться себя (Linux)

Это мой ответ. Некоторым из вас может быть легко это понять.

package package02;

public class C11PostfixAndPrefix {

    public static void main(String[] args) {
        // In this program, we will use the value of x for understanding prefix 
        // and the value of y for understaning postfix. 
        // Let's see how it works. 

        int x = 5; 
        int y = 5; 

        Line 13:   System.out.println(++x);  // 6   This is prefixing. 1 is added before x is used. 
        Line 14:   System.out.println(y++);  // 5   This is postfixing. y is used first and 1 is added. 

        System.out.println("---------- just for differentiating");

        System.out.println(x);  // 6   In prefixing, the value is same as before {See line 13}
        System.out.println(y);  // 6   In postfixing, the value increases by 1  {See line 14} 

        // Conclusion: In prefixing (++x), the value of x gets increased first and the used 
        // in an operation. While, in postfixing (y++), the value is used first and changed by
        // adding the number. 
    }
}
11
задан Community 23 May 2017 в 11:53
поделиться

12 ответов

At the application level, the most violent you can get is _exit(). Division by zero, segfaults, etc are all signals, which can be trapped - if untrapped, they're basically the same as _exit(), but may leave a coredump depending on the signal.

If you truly want a hard shutdown, the best bet is to cut power in the most violent way possible. Invoking /sbin/poweroff -fn is about as close as you can get, although it may do some cleanup at the hardware level on its way out.

If you really want to stress things, though, your best bet is to really, truly cut the power - install some sort of software controlled relay on the power cord, and have the software cut that. The uncontrolled loss of power will turn up all sorts of weird stuff. For example, data on disk can be corrupted due to RAM losing power before the DMA controller or hard disk. This is not something you can test by anything other than actually cutting power, in your production hardware configuration, over multiple trials.

14
ответ дан 3 December 2019 в 00:41
поделиться

В рамках одного запущенного процесса kill (getpid (), SIGKILL) - самый экстремальный вариант, поскольку очистка невозможна.

В противном случае попробуйте виртуальную машину или поставьте тестовую машину на удлинитель и выключите питание, если вы проводите автоматическое тестирование.

1
ответ дан 3 December 2019 в 00:41
поделиться

If you need the application to terminate itself, the following seems appropriate:

kill(getpid(), SIGKILL); // same as kill -9

If that's not violent enough (and it may not be), then I like the idea of terminating a VM inside which your application is running. You should be able to rig up something where the application can send a command to the host machine (via ssh or something) to terminate its own VM.

2
ответ дан 3 December 2019 в 00:41
поделиться

Бесконечная рекурсия, должно закончиться место в стеке (если нет, убийца OOM завершит работу):

void a() { a(); }

Вилочная бомба (если приложение не имеет ограничений на вилку, то Убийца OOM должен убить приложение в какой-то момент):

  while(1)
    fork();

Закончилась память:

  while(1)
    malloc(1);
1
ответ дан 3 December 2019 в 00:41
поделиться

I've had regression tests that we used to perform where we flicked the power switch to OFF. Пока делаю дисковый ввод-вывод.

Неспособность восстановить позже была, ну, в общем, неудачей.

Вы можете купить надежность вот так: обычно вам понадобится «сертификат конечного пользователя».

Вы можете получить это в программном обеспечении, разговаривая (грязно) к вашему ИБП. ИБП APC определенно будут отключать питание под управлением программного обеспечения!

Кто сказал, что системы не могут отключать питание самостоятельно?

1
ответ дан 3 December 2019 в 00:41
поделиться

Вам неясно, каковы ваши требования. Если вы проводите тесты восстановления после сбоя питания, вам нужно на самом деле вызвать сбой питания. Даже выполнение таких действий, как паника ядра, позволит очистить буферы записи на жестких дисках, поскольку они не зависят от процессора.

Удаленный удлинитель может быть решением, если вам действительно нужно проверить случай полного отказа.

5
ответ дан 3 December 2019 в 00:41
поделиться

Try

raise(SIGKILL)

in the process, or from the command line:

kill -9 pid

where pid is the PID of your process (these two methods are equivalent and should not perform any cleanup)

7
ответ дан 3 December 2019 в 00:41
поделиться

Почему бы не сделать остановку? Или вызвать панику?

7
ответ дан 3 December 2019 в 00:41
поделиться
kill -9

Он завершает процесс и не позволяет запускать обработчики сигналов.

11
ответ дан 3 December 2019 в 00:41
поделиться

IMHO the closest to come to a power outrage is to run the application in a VM and to power of the VM without shutting down. In all other cases where the OS is still running when the application terminates the OS will do some cleanup that would not occur in a real power outage.

26
ответ дан 3 December 2019 в 00:41
поделиться

You could try using a virtual machine. Freeze it, screw it hard, and see what happens.

Otherwise kill -9 would be the best solution.

2
ответ дан 3 December 2019 в 00:41
поделиться

Как указано, старайтесь использовать как можно больше ресурсов, пока ядро ​​вас не убьет:

while(1)
    {
    malloc(1);
    fork();
    }

Другой способ - попытаться записать на страницу только для чтения, просто продолжайте писать в память, пока не получите ошибку шины.

Если вы можете добраться до ядра, отличный способ убить его - просто записать поверх структуры данных, которую использует ядро, бонусные баллы, если вы обнаружите, что страница доступна только для чтения и помечена как доступная для записи, а затем перезапишите ее. Кстати, большинство ядер Linux допускают запись в syscall_table или таблицу прерываний, если вы напишете туда, ваша система обязательно выйдет из строя.

постарайтесь использовать как можно больше ресурсов, пока ядро ​​вас не убьет:

while(1)
    {
    malloc(1);
    fork();
    }

Другой способ - попытаться записать на страницу только для чтения, просто продолжайте писать в память, пока не получите ошибку шины.

Если вы можете добраться до ядра , отличный способ убить его - просто записать поверх структуры данных, которую использует ядро, бонусные баллы, если вы обнаружите, что страница доступна только для чтения и помечена как доступная для записи, а затем перезапишите ее. Кстати, большинство ядер Linux допускают запись в syscall_table или таблицу прерываний, если вы напишете туда, ваша система обязательно выйдет из строя.

постарайтесь использовать как можно больше ресурсов, пока ядро ​​вас не убьет:

while(1)
    {
    malloc(1);
    fork();
    }

Другой способ - попытаться записать на страницу только для чтения, просто продолжайте писать в память, пока не получите ошибку шины.

Если вы можете добраться до ядра , отличный способ убить его - просто записать поверх структуры данных, которую использует ядро, бонусные баллы, если вы обнаружите, что страница доступна только для чтения и помечена как доступная для записи, а затем перезапишите ее. Кстати, большинство ядер Linux допускают запись в syscall_table или таблицу прерываний, если вы напишете туда, ваша система обязательно выйдет из строя.

бонусные баллы, если вы обнаружите, что страница доступна только для чтения и помечена как доступная для записи, а затем перезапишете ее. Кстати, большинство ядер Linux допускают запись в syscall_table или таблицу прерываний, если вы напишете туда, ваша система обязательно выйдет из строя.

бонусные баллы, если вы обнаружите, что страница доступна только для чтения и помечена как доступная для записи, а затем перезапишете ее. Кстати, большинство ядер Linux допускают запись в syscall_table или таблицу прерываний, если вы напишете туда, ваша система обязательно выйдет из строя.

0
ответ дан 3 December 2019 в 00:41
поделиться