Когда я запускаю Java-программу из оболочки, все работает нормально. Однако, если я запускаю ту же программу с той же командой и тем же пользователем с помощью CRON, я получаю java.lang.OutOfMemoryError сразу через несколько секунд.
Вдобавок CRON ничего не может сделать, пока я не убью заблокированную java-программу. Независимо от того, какое задание cron должно быть запущено, оно всегда заканчивается сообщением «(CRON) error (cannot fork)» в системном журнале. После убийства java-программы все новые cronjobs снова работают нормально.
Программа java создает много потоков (1500 при запуске, еще больше после) и - при запуске crontab - всегда начинает зависать сразу после создания 475 потоков. Так что, может быть, это что-то вроде "OutOfThreads", даже если OutOfMemory регистрируется.
В целях тестирования я уменьшил количество исходных потоков до 450, и с этой настройкой все работает нормально в течение нескольких минут (пока не будет создано больше потоков). Однако мне действительно нужны эти 1500+ потоков, и я понятия не имею, почему это невозможно, когда java-программа была запущена crontab. Как уже упоминалось, все работает отлично, пока я запускаю программу с помощью оболочки, а не crontab.
Проблема возникает только с Ubuntu 16.04, все старые версии работали очень хорошо. Это ошибка или новая функция безопасности? Я не нашел никакой информации об этой проблеме, поэтому надеюсь, что кто-нибудь может помочь.