Подтвердить что ты не робот

Как скомпрометировать мое приложение Node?

Я работаю над потоком работы с Dokku и Docker, и теперь я хочу позаботиться о непрерывности моего приложения (в соответствии с Forever). Чтобы проверить его, мне нужен способ умышленного сбоя моего приложения.

Я создал новый маршрут /crashme с функцией, которая должна разрушить мое приложение.

Не нашел способ, который работал локально с node/nodemon до сих пор, я пробовал:

  • Деление на ноль
  • Выбросить новое пользовательское исключение
  • Ссылка на переменную, которая не существует

Ни одна из этих вещей не приведет к сбою приложения в том месте, где его нужно перезапустить.

Как я могу его снести?

4b9b3361

Ответ 1

Мне приходят в голову три вещи:

  • Вы можете просто позвонить process.exit. Это наверняка приведет ваше приложение к состоянию, в котором его необходимо перезапустить.
  • Другим вариантом может быть запуск бесконечного цикла, например, while (true) {}. Это должно сделать Node.js использовать 100% вашего процессора, и, следовательно, приложение также должно быть перезапущено (хотя это, конечно, означает, что вы/кто-то должен смотреть ваше приложение).
  • Создайте модуль на C, который сбой, например. пытаясь получить доступ к случайному месту в памяти. У меня нет такого модуля под рукой, но я уверен, что кому-то с навыками C должно быть довольно легко написать такой модуль.

Ответ 2

Чтобы добавить к Golo ответ:

Модуль C для сбоя по ошибке сегментации:

int main ()
{
    //Create a array of 1 char
    char a [1];
    //Create a index
    int i = 0;
    //Infinite loop to go around the compiler
    while(1)
    {
        //Write on case i of a, on the second iteration, it will write in unreserved memory => crash
        a[i] = 0;
        i = i + 1;
    }
    //Should not go there
    return -1;
}

Ответ 3

И добавление к ответу DrakaSAN еще более простого модуля C для аварийного завершения:

int main()
{
    *(int*)(0) = 0;
    return -1;
}

Еще более короткие доступны на этой странице. Если вы не хотите, чтобы это было слишком трудно читать, вы можете пойти с

int main()
{
    int i=1/0;
}

Ответ 4

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

process.exit остановит мое приложение, но навсегда не перезапустит его. (Вечно журналы только что сказали что-то вроде процесса, которое завершено.)

Что для меня работало, вставляя это в мой маршрут /crash:

setTimeout(function () {
      throw new Error('We crashed!!!!!');
}, 10);