Интересует true-way вызова консольных скриптов из Java.
Допустим, есть скриптик, который надо часто дергать. Скажем раз в минуту помноженное на количество клиентов, берущихся из базы, с последующей обработкой не очень больших ответов, получаемых с задержкой.
Метод Runtime.exec() будет на каждый вызов создавать системный процесс, что мне кажется несколько устрашающим, если клиентов будет около 1000.
А как Вы собираетесь запускать shell скрипт не запуская новый процесс?
Да вот и не знаю. Но одно дело запустить один-два или 10 процессов, другой поназапускать их в цикле while i++<1000.
На счет groovy, я думал, но идея какая — я хочу запускать curl -o /dev/null -s -w "%{timetotal}" с обработкой awk'ом кое-чего еще, что ИМХО легковеснее в виде скрипта, ибо что на groovy, что на java мне надо будет кучу всего вокруг написать, чтобы повторить этот функционал.
Вы не сможете запустить шелл скрипт не запуская шелла — т.е. еще процесс.
Что же касается функциональности, то на груви есть много для обработки регулярных выражений и текста. В крайнем случае есть язык Sleep, который тоже можно запускать из Явы, и который содержит возможности Перла по обработке текста. В любом случае, если надо запускать много скриптов, то запускать шел скрипты из Явы — будет процесс на скрипт
В unix запуск нового шелл-скрипта (если это шелл скрипт) занимает долю секунды (подробнее скаже команда time), что сравнимо мало в сравнении с частотой запуска. Ничего страшного в создании нового процесса нет.
А вот если это java-программа, то ее время инициаизации может быть значительным. Такие программы лучше не перезапускать часто.
Но если вы хотите дотронуться до основ джедайского искусства: сделайте демон, который будет запускаться, делать долю работы и засыпать на минуту, а ваш Java-код будет раз в минуту его пинать сообщением в сокет, а также оживлять и перезапускать при зависании/аварийном завершении.
Там идея какая — есть java приложение, которое управляет входными данными, оно живет отдельно, может сливать куда-то эти входные данные с периодичностью. Далее надо сделать джобу, которая непосредственно будет периодически выполняться. Для примера, как я писал — это curl. Ее можно либо заимплементить в джаве, что потребует солидных усилий как по имплементации, так и, имхо, по затратам на выполнение. А можно выполнить ее как shell скрипт, что мне кажется более оптимальным. Теперь надо придумать, как эффективнее организовать передачу входных данных, периодическое выполнение джобы и получение результатов исходя из условий, что описаны в вопросе.
Про джедайский способ с демоном — спасибо, надо посмотреть в эту сторону. Но чую, что там надо будет много сложностей понаписать на шелле, чтобы периодичность была правильной…
В дополнение к вышесказанному. Т.е. всё верно, запустить скрипт без запуска шелла, очевидно, невозможно)
Хм, так поднимите один процесс и дёргайте его всё время, давая ему скрипт. Либо вынесите запуск скрипта наружу в нативную среду каким-либо образом (демоном, как выше сказали, или шедулером или как-то так).