Может ли команда времени Unix мешать работающей программе?

Из этого ответа на команду Time Unix я получаю основную идею о том, как работает время. Он создает новый процесс и выполняет команду в этом новом процессе. Тем не менее, я столкнулся с поведением, которое я не в состоянии понять.

Я пытаюсь профилировать lusearch, эталон комплекта тестов DaCapo. Я хочу запустить его с разными конфигурациями (количество потоков и количество итераций), не обращая внимания на результаты теста и использовать время для записи реального, пользовательского и системного времени. С подавляющим большинством конфигураций мой скрипт работает просто отлично, запускает тест и записывает время.

С одной конкретной конфигурацией (большой набор данных, два потока и десять итераций) тест иногда не достигает завершения (80% случаев из почти 100 предварительных). Это команда, которую я использую для запуска:

(time -p java -jar DaCapo.jar lusearch -s large -t 2 -i 10 
 >/dev/null 2>/dev/null) 2>&1 | awk '{print $2 $4 $6}' > timed &

Тем не менее, если я не опередил время, тест просто завершится в 100% случаев (примерно в 100 случаях):

(java -jar DaCapo.jar lusearch -s large -t 2 -i 10 >/dev/null 2>/dev/null)

Такое поведение происходит только с этим тестом - и с этой конфигурацией - в то время как если профилировать какой-либо другой тест или использовать другое количество потоков или другое количество итераций, я не вижу, что происходит то же самое. Я думаю, что это связано с тем, что время делает, что мешает тесту.

Я не вижу, как fork+exec мог изменить поведение тестов. Есть ли что-то конкретное, что может вызвать это? Например: использует ли время какой-то ресурс, который также хочет использовать эталонный тест? Я делаю что-то не так при запуске теста?

1 ответ

"Не достигает конца" довольно расплывчато. Вы будете пропускать любые сообщения об ошибках, так как вы отправляете все /dev/null, Невозможно дать определенный ответ, не зная ничего о том, что делает эта программа, ни сообщений об ошибках, ни обратной трассировки.

Единственное реальное различие, о котором я могу думать, это то, что вы не справляетесь с этим во втором случае. Bash с определенными комбинациями каналов и перенаправлений не перенаправляет /dev/null безоговорочно при заднем плане. Возможно, что какая-то часть программы чувствительна к этому. Посмотрите мои тестовые примеры для некоторых примеров, где требуется явное перенаправление. Bash здесь не полностью следует POSIX и отличается от всех других оболочек определенными комбинациями асинхронных списков, каналов и перенаправлений.

Я серьезно сомневаюсь, что это имеет какое-либо отношение к time, Если вы не получите лучшего ответа здесь, возможно, спросите список помощи bash, но они не смогут улучшить без лучшей информации.

Другие вопросы по тегам