У меня есть собственное приложение, упакованное с использованием dpkg. Приложение зависит от нескольких файлов .deb, которые я пытаюсь установить из предустановленного скрипта моего приложения. Сценарий preinst проверяет, установлен ли зависимый файл deb, если нет, то устанавливает его с помощью команды dpkg -i
. Это повторяется для всех зависимых файлов deb, необходимых для основного приложения.
Когда я пытаюсь установить основное приложение, используя dpkg -i
, команды возвращают ошибку при попытке выполнить сценарий preinst. Ниже приведено сообщение об ошибке:
dpkg: error: dpkg status database is locked by another process
Я удалил файл /var/lib/dpkg/lock
и попытался установить приложение. Но безрезультатно. Если я запускаю сценарий preinst отдельно, как и любой другой сценарий оболочки, он запускается без проблем. Все файлы deb будут установлены правильно. Таким образом, проблема заключается только в том, когда этот preinst-скрипт автоматически запускается dpkg -i command
.
Спасибо, ObsessiveSS0F за ваш быстрый ответ.
1123 Я понимаю, что вы делаете, но это не поможет моей ситуации. Позвольте мне рассказать вам, почему.
Я продолжал исследовать причину, по которой preinst не удалось установить файлы .deb, и, думаю, я понял, почему.
Я изменил сценарий preinst для резервного копирования блокировок, созданных процессом dpkg, во временную папку и удалил исходные блокировки. (команда lsof сообщила, что блокировки были удалены). Теперь, когда блокировки сняты, команды dpkg -i в скрипте preinst выполняются без проблем. Я восстановил блокировки перед выходом из скрипта preinst, чтобы основная команда dpkg -i могла продолжаться. Это сработало, но у меня есть ощущение, что это неправильный подход.
Я все еще пытаюсь найти альтернативные способы установки файла .deb вместе с его зависимостями.
Мысль о перетасовке файлов блокировки делает меня неудобным. Если гарантированно не возникнет проблем с установкой приложения, то, похоже, проблемы не должно быть, однако я считаю, что предустановочный сценарий больше подходит для таких вещей, как остановка служб, на которые будет влиять установка.
Похоже, основная причина проблемы в том, что предустановочный скрипт очищается от операции dpkg после установки файла блокировки. Кажется вероятным, что правильный способ сделать это - либо полностью отделить установку зависимостей, либо повторно упаковать приложение, чтобы оно работало с локальным ppa и корректно устанавливало зависимости.
Мне интересно, не лучше ли установить зависимости с помощью --set-selection и обработать их с помощью dpkg до или после установки приложения. Зависимости могут быть загружены с помощью:
sudo dpkg --set-selections < dependency_files
Где файл dependency_files находится в формате, например:
samba install
samba-common install
samba-common-bin install
samba-ldb-tools install
samba4 install
samba4-common-bin install
Я полагаю, что файлы могут быть затем установлены с помощью
dpkg --selected-only
Это может быть даже возможно что ваш предустановочный скрипт можно использовать как минимум для части операции --set-selections.
Что касается переупаковки, я не могу здесь помочь, но, похоже, существует сообщество разработчиков пакетов, которые могли бы помочь:
Для установки файлов .deb необязательно использовать сценарий preinst. Вы можете просто добавить зависимости, а затем упаковать их, используя архив, и любые зависимости и пре-зависимости будут установлены автоматически.