Команда lsof не смотрит в указанный каталог, когда я указываю пользователя
Поэтому я писал скрипт на python, и моей целью было использовать lsof для вывода списка всех открытых файлов в определенном каталоге (моей домашней папке) для локального пользователя и вывода только записей 'uniq'.
Мой сценарий выглядел так:
import os, sys, getpass
user = getpass.getuser()
cmd = "lsof -u " + user + " +d ~ | sort | uniq"
os.system(cmd)
Этот тип делает то, что я хочу, это делает lsof для текущего локального пользователя, но он не может искать конкретно в домашнем каталоге, который я указал. Вместо этого он делает lsof в корневом каталоге и перечисляет все lsof для всей файловой системы для пользователя. Тем не менее, когда я делаю ту же команду без -u user
это выглядит специально в домашнем каталоге. Я выяснил, почему это именно так, и да, я пытался использовать +d /home/
а также +d ~/home/
вместо просто +d ~
чтобы заставить это работать безуспешно, так что я немного озадачен. Любой совет будет полезен:)
2 ответа
lsof объединяет опции, используя OR по умолчанию, попробуйте добавить -a
флаг и их вместе.
Со страницы руководства:
Обычно параметры списка, которые специально указаны, имеют значение ORed, т. Е. При указании параметра - i без адреса и параметра -ufoo создается список всех сетевых файлов ИЛИ файлов, принадлежащих процессам, принадлежащим пользователю ''foo''.
Есть некоторые исключения, но ни одно из них не применимо в вашем случае.
Так, -u me +d ~
означает "все файлы, которые открыты мной или в моем домашнем каталоге.
Так как ты делаешь то, что хочешь?
Опция -a может использоваться для выбора. Например, указание -a, -U и -ufoo создает список только файлов сокетов UNIX, которые принадлежат процессам, принадлежащим пользователю ''foo''.
Бросить -a
там:
cmd = "lsof -a -u " + user + " +d ~ | sort | uniq"
Кстати, в общем, вы действительно не хотите использовать os.system
в Python, поэтому в документации конкретно говорится:
subprocess
модуль предоставляет более мощные средства для порождения новых процессов и получения их результатов; использование этого модуля предпочтительнее, чем использование этой функции. См. Раздел " Замена старых функций разделом модуля подпроцесса " вsubprocess
документация для некоторых полезных рецептов.
И действительно, зачем использовать sort
а также uniq
вместо сортировки в Python? Или, в качестве альтернативы, если все, что вы хотите сделать, это запустить этот конвейер оболочки, а не обрабатывать его каким-либо образом в Python, зачем вообще использовать Python вместо bash?