Вчора я намагався скласти пакет 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 показуватиме вам тільки системні дзвінки (не функціональні дзвінки), але він все одно може дати вам цінну інформацію, якщо він обертається під час перегляду чи для певного файлу.