Вчора я намагався скласти пакет ROOT з джерела. Оскільки я складав його на 6-ядерній монстр-машині, я вирішив іти вперед і будувати, використовуючи кілька ядер, використовуючи make -j 6
. Спочатку компіляція пройшла гладко і дуже швидко, але в якийсь момент make
висіла, використовуючи 100% ЦП лише на одному ядрі.
Я трохи погуглив і знайшов цю посаду на дошках повідомлень ROOT. Оскільки я сам створив цей комп’ютер, я переживав, що я неправильно застосував радіатор і процесор перегрівся чи щось. На жаль, у мене немає на роботі холодильника, який я можу вставити. ;-)
Я встановив lm-sensors
пакет і побіг make -j 6
знову, цього разу контролюючи температуру процесора. Хоча вона отримала високу (близько 60 ° C), вона ніколи не проходила повз високу або критичну температуру.
Я спробував запустити, make -j 4
але знову make
висів десь під час компіляції, цього разу в іншому місці.
Врешті-решт, я склав просто біг, make
і це спрацювало чудово. Моє запитання: Чому воно повисло? Зважаючи на те, що він зупинився на двох різних місцях, я б здогадався, що це було пов’язано з якоюсь умовою гонки, але я б подумав, що make
повинен бути досить розумним, щоб все було в правильному порядку, оскільки він пропонує -j
можливість.
-j >1
.
$(shell ...)
кінцевому рахунку виконується команда, яка чекала на введення зstdin
. Це було викликано, коли змінна була порожньою і жодні аргументи файлів не передавались команді.
strace -p <pid>
і подивитися, чи зможете ви дізнатися, на що він дивиться / на що. strace показуватиме вам тільки системні дзвінки (не функціональні дзвінки), але він все одно може дати вам цінну інформацію, якщо він обертається під час перегляду чи для певного файлу.