На этот вопрос уже есть ответ:
Я написал сценарий bash для установки некоторых пакетов при первой загрузке моего Ubuntu 16.04 VPS. Платформа VPS, которую я использую, запускает ее во время ввода сервера в эксплуатацию. Когда он запускается, я получаю такую ошибку:
...
Reading package lists...
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
...
Итак, мой вопрос: Как мне спать
, пока все в порядке, продолжайте установку?
Я выполнил довольно немного погуглил, чтобы найти твердый ответ на этот вопрос (я новичок в сценариях bash), и натолкнулся на несколько предлагаемых решений, но есть много шума. Некоторые ответы относятся к определенным системам обеспечения, а другие подходы кажутся немного хакерскими .
Мое решение на данный момент - это просто sleep 30
в верхней части моего скрипта, что определенно не является надежным решением.
Я попытался собрать что-то вроде этого, но это не сработало:
while true
do
sudo lsof /var/lib/apt/lists/lock &> /dev/null
[ $? = 0 ] && break
sleep 1
done
На моем личном компьютере он спит вечно из-за ошибки ( ВНИМАНИЕ: невозможно stat () fuse.gvfsd-fuse ...
), а на VPS он вообще не спит.
Есть идеи, почему это не работает, или идеи по поводу лучшего подхода?
Кстати, если вам интересно, сценарий, который я пытаюсь запустить, выглядит просто:
#!/bin/sh
curl -sL https://deb.nodesource.com/setup_8.x | bash -
apt-get install -y nodejs
И полный вывод можно увидеть в this pastebin .
Поместите это в свой сценарий, затем запустите свой сценарий с sudo
.
#!/bin/sh
while [ -f /var/lib/apt/lists/lock
do
# The lock file is found, wait for it to be removed.
sleep 3
done
# The lock file is not found, let's perform our actions.
curl -sL https://deb.nodesource.com/setup_8.x | bash -
apt-get install -y nodejs