Как перечислить процессы, блокирующие файл?

При попытке выполнить команду из сценария, передайте -t опция к ssh:

ssh -i file.pem -t myhost “sudo -n myscript”

-n опция к sudo будет препятствовать тому, чтобы sudo запросил пароль; если команда потребует пароля, то Вы получите ошибку.

Это работало на доступ к экземплярам EC2.

52
09.08.2013, 02:14
4 ответа

lslocks, от пакета util-linux, делает точно это.

В MODE столбец, процессы, ожидающие блокировки, будет отмечен с a *.

44
27.01.2020, 19:33
  • 1
    говорит, что util-linux уже является новейшей (2.20.1-1ubuntu3) версией, но у меня нет lslocks; существует ли repo, который я могу использовать, который даст мне его? –  Benubird 08.08.2013, 18:36
  • 2
    Похож это было добавлено в 2,22, таким образом, версия Ubuntu слишком стара. По-видимому, новая версия будет доступна в конечном счете. (Это также имеет место с RHEL 6 или CentOS.) Вы могли создать его сами, или Вы могли использовать lsof подход Joel Davis предлагает. –  mattdm 08.08.2013, 21:26
  • 3
    lslocks чтения /proc/locks, в повышении можно считать, что непосредственно сами, с протестом, что файлы определяются устройством и inode, а не именем. Так как Вы знаете файл, который не должен быть проблемой. Заблокированный доступ имеет a -> префикс перед столбцом типа блокировки (таким образом добавляющий столбец к той строке). –  mr.spuratic 09.08.2013, 13:34

Две возможности: lsof (мое предпочтение) или lslk (специально для блокировок файла):

[root@policyServer ~]# lslk | grep "master.lock"
SRC          PID   DEV  INUM   SZ TY M   ST WH  END LEN NAME
master      1650 253,0 12423   33  w 0    0  0    0   0 /var/lib/postfix/master.lock

[root@policyServer ~]# lsof | grep "master.lock"
master     1650      root   10uW     REG              253,0       33      12423 /var/lib/postfix/master.lock

Вывод lslk является self-expanatory, но lsof помещает описание блокировки в столбец "FD" (который является 10uW выше). Из страницы справочника:

The mode character is followed by one of these lock characters, describing the type of lock applied to the file:

N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part      of the file;
X for an SCO OpenServer Xenix lock on the      entire file;
                       space if there is no lock.

Так столбец "FD" lsof выше ломается к:

10 Литеральный дескриптор этого открытого файла. С чем связан /proc/1650/fd/10

u Файл открыт для чтения и записи

W программа имеет запись, соединяют файл.

27
27.01.2020, 19:33
  • 1
    , который я не могу найти, где получить lslk, и это, кажется, больше не сохраняется. Стоящий указания также, то, что, если Вы хотите, чтобы lsof только показал процессы, которые на самом деле блокируют файл, Вам нужно к grep для "^mutex". Это также не различает 'содержание' и 'блокирование'. –  Benubird 09.08.2013, 11:35
  • 2
    Первый символ буквы поля FD является файлом, этому открыли файл с (я предполагаю, что это - то, что Вы подразумеваете под содержанием), дополнительный второй символ буквы является блокировкой (если таковые имеются), это имеет на файле (который я принимаю, то, что Вы подразумеваете под "блокированием"), Также flock ! = взаимное исключение. Ваш grep отсутствовал бы, блокировки как та в сообщении (не говоря уже о первом поле название программы...) –  Bratchley 09.08.2013, 14:49
  • 3
    D'oh! Вы правы - "взаимное исключение" было названием моего сценария, таким образом держание для 'взаимного исключения' только применимо к моему случаю. Спасибо за указание, что –  Benubird 09.08.2013, 18:50
  • 4
    хорошо похож, я сделал ляп также: "первый символ буквы является режимом, с которым ему открыли файл..." –  Bratchley 09.08.2013, 20:06

LSOF может помочь увидеть список файлов. Вот способ увидеть заблокированные файлы.

sudo lsof /var/lib/dpkg/lock 
5
27.01.2020, 19:33

в случае, если lsofотсутствует в системе, ls /proc/*/fd/* | grep LOCK_FILE_NAMEдолжен предоставить ту же информацию.

1
27.01.2020, 19:33

Теги

Похожие вопросы