Команда 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?

Другие вопросы по тегам