====== 2022-11-09 Unraid - проблема с переодическим lsof который вешает систему ====== На одном из домашних серверов установлен UNRAID. Недавно заметил такую особенность, когда снял с этого nas всю полезную нагрузку. Переодически раз в несколько минут запускается команда lsof которая повергает весь сервер в ступор. Вызывается она с такими переменными: sh -c LANG='en_US.UTF8' lsof -Owl /mnt/disk[0-9]* 2>/dev/null|awk '/^shfs/ && $0!~/\.AppleD(B|ouble)/ && $5=="REG"'|awk -F/ '{print $4}' По-видимому это часть сбора статистики для веб интерфейса, которая написана привычным для unraid способом - "кое как лишь бы работало". Вызывается эта строка из файла: /usr/local/emhttp/webGui/nchan/update_1 Вот полный листинг этого файла: #!/usr/bin/php -q /dev/null|grep -Po 'fan\d_input: \K\d+'",$rpms); $info = max(round((1-$memory[1]/$memory[0])*100),0)."%\0".implode("\0",$sys); $rpms = count($rpms) ? implode(" RPM\0",$rpms).' RPM' : ''; $names = array_keys((array)parse_ini_file("$varroot/shares.ini")); exec("LANG='en_US.UTF8' lsof -Owl /mnt/disk[0-9]* 2>/dev/null|awk '/^shfs/ && \$0!~/\.AppleD(B|ouble)/ && \$5==\"REG\"'|awk -F/ '{print \$4}'",$lsof); $counts = array_count_values($lsof); $count = []; foreach ($names as $name) $count[] = $counts[$name] ?? 0; $count = implode("\0",$count); publish('update1', "$info\1$rpms\1$count"); sleep(5); } ?> Cкорее всего этот скрипт считает количество открытых сессий к общим папкам для вывода этой информации на консоль в этом месте интерфейса: {{:blog:2022:11:09:20221109-160854.png}} Бесполезная трата ресурса. Я поискал записи на форуме unraid на предмет данной проблемы. Судя по всему она появилась достаточно давно и беспокоит только некоторых пользователей с нагруженными машинами, где lsof выполняется очень долго. Для начала я попробовал исключить строку, вызывающую lsof из файла update_1. Это не принесло никакого результата, потому что видимо файл загружен в память и система работает с ним оттуда. После перезагрузки системные файлы заменяются файлами из образа, так как ОС работает с "золотым" образом который при старте системы загружается в память с USB диска. В конце концов я заметил что процесс php работающий с данным файлов все еще запущен и убил его командой: pkill -f "/usr/bin/php -q /usr/local/emhttp/webGui/nchan/update_1" Затем я провел еще несколько наблюдений: * После перезагрузки системы скрипты update_1, update_2, update_3 не запускаются, пока пользователь не войдет в веб интерфейс и не откроет страницу "Dashboard". * Скрипты продолжают отрабатывать в любом случае вне зависимости как пользователь покидает страницу. * Если убить скрипты командой ''killall /usr/bin/php'' - они не возвращаются никогда. Значит в системе есть какая-то проверка на успешность запуска этих скриптов, например PID файл. Написал по этому поводу [[https://forums.unraid.net/topic/114162-100-cpu-usage-lsof/?do=findComment&comment=1189566|реплай в самой продвинутой ветке форума unraid.]]