Ранее сегодня, когда что-то строил, я решил запустить make
как
$ make -j
возможно, по привычке с другими программами, например, cabal
где по -j
умолчанию разумный предел.
Примерно через 20 секунд весь мой рабочий стол остановился . Я ищу различные признаки активности. Нет фанатов раскручиваться. Индикатор жесткого диска горит зеленым, но я не слышу активности диска. Hmmmmm. После 10 минут молчания я наконец вижу ответ на первое нажатие клавиш, которое я сделал много лет назад, и я также начинаю слышать слишком знакомый звук удара диска. Спустя 20 минут, медленно пытаясь пробраться в терминал на этой машине, не отвечающей на запросы, я прогнулся и использовал REISUB.
Сначала я подумал, что виновником может быть не связанное с ним настольное приложение, потому что у меня давно были ограничения памяти для интерактивных сеансов bash, чтобы я не оказался в такой ситуации! Но /var/log/syslog
рассказывает другую историю; ОЫЙ убийца оставил некоторые ps
свалки , которые подозрительно упакованы с c++
и cc1plus
процессами!
Вот частотный анализ одного из этих дампов:
Command Number of appearances
'sh' 322
'c++' 321
'cc1plus' 321
'chrome' 27
'make' 27
'bash' 3
all else combined 120
Поэтому я проверяю справочную страницу для GNU make: (выделение добавлено)
-j [jobs], --jobs [= jobs] Определяет количество заданий (команд) для одновременного запуска. Если есть несколько опций -j, последний действует. Если опция -j указана без аргумента, make не будет ограничивать количество заданий, которые могут выполняться одновременно.
Я не хочу видеть, смогу ли я воспроизвести проблему (Доктор, мне больно, когда я делаю это ...) , но результаты исследования пока кажутся проверенными: очевидно, make -j
и сотни возникающих процессов должны иметь был причиной зависания и порчи диска. Тем не менее, поиск в Интернете, я не могу найти много предупреждений против этого. Я делаю поспешные выводы?
Это make -j
так опасно, как мне кажется? Если так, то почему он там, и что можно сделать, чтобы защитить его от идиотов?
make
собственные средства и делайте export MAKEFLAGS="-j 4"
. Для дальнейших расследований I советов чтения , прежде чем печатать . PS: <количество ядер> + 2 хорошо служило мне вот уже почти два десятилетия. В свое время Линус сделал финал make -j128
перед выпуском ядра.
alias make="make -j4"
чтобы исключить необходимость добавления-jN
аргументов, но я все еще не продумал все возможные последствия ...