2015-04-29 1 views
2

Я часто не могу запустить apt-get install на своем сервере. Например:Как записать доступ к файлам через 24 часа?

$ sudo apt-⁠get install tmux 
E: Could not get lock /⁠var/⁠lib/⁠dpkg/⁠lock -⁠ open (11: Resource 
temporarily unavailable) 
E: Unable to lock the administration directory (/⁠var/⁠lib/⁠dpkg/⁠), is 
another process using it? 

Бывает много, почти каждый день. Всякий раз, когда я пытаюсь выяснить, кто еще блокирует его командой lsof, я уже слишком поздно, и блокировка уже исчезла. Действительно очень странно.

Есть ли уловка, как я могу записывать более 24 часов, кто еще блокирует /⁠var/⁠lib/⁠dpkg/⁠lock?

+0

Возможно, это '/ etc/cron.daily/apt'? – mata

+0

Для выяснения, это происходит в любое время суток и длится пару секунд. Это означает, что он не может быть от '/ etc/cron.daily/apt', и работа cron может решить его (потому что он длится всего несколько секунд) –

ответ

2

Я думаю, что существует несколько решений.

1: написать простой скрипт, например while sleep 1; do lsof -n|grep /var/lib/dpkg/lock >>/var/log/dpkglocktmp.log; done. Это просто, но не очень красиво, но, как кратковременный багтрекинг, это для меня все в порядке. Вы получите список процессов в файле журнала.

Удлинитель:while sleep 1; do lsof -n|grep /var/lib/dpkg/lock; done|tee --append /var/log/dpkglocktmp.log будет одновременно записываться на консоль и в файл журнала. Если вы не сохранили свое соединение ssh, вы можете запустить его в screen.

2: Ядро Linux имеет функциональность inotify, что позволяет процессам получать сигналы о событиях, происшедших в файлах, которые они просматривают. В нем есть множество инструментов, наиболее известными являются incron. Он позволяет вызывать скрипт в случае события файла. Возможно, есть и более сложные инструменты, нацеленные именно на проблемы, похожие на ваши.


я имел наиболее похожие проблемы, как меткое обновление/установку просил у меня что-то, я забыл, что и позже пытался запустить другие склонный в другой SSH сессии.

+0

Прохладный. Какие изменения необходимы, если я хочу, чтобы этот цикл while отображал вывод lsof на консоль при одновременном записи в файл журнала? И пусть он работает вечно без необходимости открытия сеанса SSH? Это весь день ... –

+1

@MichaelHeuberger Я распространил его на свой ответ. В вашем случае я использовал именно это, с экрана. И экран - прекрасный инструмент, вы можете иметь 9 виртуальных консолей в фоновом режиме, отсоединить их после работы и снова на следующий день. – peterh

1

Вы могли бы сделать хрон, который гласил:

lsof | grep /var/lib/dpkg/lock >> whodunit.txt 

И попытаться поймать их с поличным.

Смежные вопросы