Как скомпрометировать мое приложение Node?
Я работаю над потоком работы с Dokku и Docker, и теперь я хочу позаботиться о непрерывности моего приложения (в соответствии с Forever). Чтобы проверить его, мне нужен способ умышленного сбоя моего приложения.
Я создал новый маршрут /crashme с функцией, которая должна разрушить мое приложение.
Не нашел способ, который работал локально с node/nodemon до сих пор, я пробовал:
- Деление на ноль
- Выбросить новое пользовательское исключение
- Ссылка на переменную, которая не существует
Ни одна из этих вещей не приведет к сбою приложения в том месте, где его нужно перезапустить.
Как я могу его снести?
Ответы
Ответ 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);