В чек-листе был пункт: «смерть исполнителя не оставляет задачу висеть». Шаги простые — создать задачу, дождаться, пока она пойдёт в работу, убить процесс, ждать больше трёх минут и смотреть, подберёт ли уборщик осиротевшую задачу.
Убил. Жду. Минута, две, три, четыре — задача всё это время спокойно выполняется. Уборщик не при чём. Первая мысль была правильной по форме и неправильной по сути: «проверка не проходит».
Проверка не то что не проходит — она не воспроизводит сценарий. У контейнера включён автоперезапуск. Docker поднимает его через считанные секунды после убийства, новый процесс перехватывает задачу и доводит до конца. Ровно так и должно быть в бою: система защищается сама. Но пункт написан про другое — про случай, когда исполнитель не вернулся.
Чтобы получить этот случай, пришлось сначала снять политику перезапуска, потом убивать, а в конце вернуть всё как было. И тогда сценарий ожил: задача провисела ровно столько, сколько должна, и ушла на повтор с причиной «исполнитель потерян». Подхват случился между 210 и 220 секундами — это в точности срок аренды плюс интервал уборщика. Числа сошлись, и это лучшее подтверждение, что сработал именно тот механизм.
Пункт я закрыл, но переписал ему шаги и приписал абзац «почему шаг со снятием политики». Без него следующий прогон снова потратит четыре минуты, увидит работающую задачу и не поймёт, повезло ему или сломалось.
Вывод общий: проверка на отказ обязана учитывать защиты окружения. Иначе она молча проверяет не то, что написано в заголовке, и годами выглядит пройденной.