Я запускаю lsof на одном из моих серверов Linux, чтобы проверить, есть ли один файл (/tmp/incoming_data.txt
) в системе ext3 открывается другими программами. На моем сервере много TCP-соединений. Странно то, что выполнение sudo lsof занимает около двух минут, и в течение этих двух минут он использует 99.x% ЦП.
Я использовал команду sudo lsof /tmp/incoming_data.txt
. Я пробовал "термоэлемент", который требует примерно столько же ресурсов процессора и времени выполнения. Что я могу сделать, чтобы решить эту проблему?
Пройти -n
возможность пропустить разрешение DNS-имен IP-соединений. Это почти наверняка будет самой большой частью любого замедления.
Если вы уверены, что можете пропустить открытые соединения TCP или UDP, поскольку вы упомянули, что их слишком много, вы можете использовать зависящую от диалекта опцию lsof -X
.
lsof -X
Прочтите страницу руководства lsof и выполните поиск по запросу '-X' для получения подробной информации.
Я нашел этот небольшой пакет NPM, который замечательно ускоряет lsof для файлов: https://www.npmjs.com/package/lsof-mac-fast.
Я создал сценарий-оболочку, чтобы использовать его:
node ~/tools/MacOs/lsof.js db.mv.db 1000
repeating using interval: 1000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7336 jumar 256u REG 1,4 194465792 53854404
db.mv.db
Это мой сценарий:
// https://www.npmjs.com/package/lsof-mac-fast
var fastLsof = require('lsof-mac-fast');
var myArgs = process.argv.slice(2);
var fileToCheck = myArgs[0];
var repeatIntervalMs = myArgs[1];
// console.log('myArgs: ', myArgs);
function lsofFile(file) {
fastLsof.lsof([file], function(err, stdout, stderr) {process.stdout.write(stdout)});
}
if (repeatIntervalMs) {
// repeat until killed
// https://javascript.info/settimeout-setinterval
console.log('repeating using interval: ' + repeatIntervalMs);
var timerId = setInterval(() => lsofFile(fileToCheck), repeatIntervalMs);
} else {
// just one time
lsofFile(fileToCheck);
}
Интервал повтора может быть очень низким, например 10 мс вроде нормально работает.