Я видел много программ, таких как Update Manager и Synaptic Package Manager, они ждут, если какая-то другая программа использует /var/lib/dpkg/lock
и будет заблокирована. Как мы можем сделать это через Терминал? Я видел руководство apt-get
, но не нашел ничего полезного.
Вы можете использовать команду aptdcon
для постановки задач диспетчера пакетов в очередь путем взаимодействия с aptdaemon вместо прямого использования apt-get.
Таким образом, вы можете просто выполнить sudo aptdcon --install chromium-browser
или что-то еще, и пока эта команда запущена, вы можете запустить ее снова, но установить другие пакеты, и apt-daemon просто поставит их в очередь ошибки.
Это особенно полезно, если вы делаете длительное обновление или что-то в этом роде и хотите продолжить установку пакетов, или если вы пишете что-то вместе и хотите убедиться, что установка будет более надежной.
Ny fomba fiasa tena tsotra dia script iray niandry ny tsy hisokatra ny hidin-trano. Andao antsointsika hoe waitforapt
ary apetaho ao / usr / local / bin
:
#!/bin/sh
while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do
sleep 1
done
Avy eo mihazakazaha fotsiny sudo waitforapt && sudo apt-mahazo mametraka izay
. Azonao atao ny manisy fanavakavahana ao amin'ny sudoers
hahafahanao mihazakazaka azy tsy mila teny miafina (mila izany ianao amin'ny apt-get
ka tsy ahazoana tombony lehibe).
indrisy tsy filaharana ity. Raha jerena fa misy ny asan'ny apt mifandraika ("Azonao antoka ve fa hesorinao daholo ireo fonosana ireo ?!"), tsy hitako ny fomba tsara manodidina an'io ...
Ankoatra ny &&
miharihary dia mety hitady ny apctcon
ianao. Ity fitaovana ity dia afaka mamantatra tranga apt hafa ary miandry azy ireo hahavita azy:
sudo aptdcon --safe-upgrade [/] 11% Waiting for other software managers to quit Waiting for aptitude
(mihazakazaka mahay aho any an-toeran-kafa)
Ny tombony azon'ity fitaovana ity dia ny ahafahanao mitahiry hetsika maro mifanesy nefa tsy manahy ny amin'izay hataonao dia hanao manaraka. aptdcon
dia mety indrindra amin'ny script tsy misy mpiambina, ary ny fametrahana GUI, satria azonao atao ny mamela ny fitaovana mihazakazaka any aoriana mba tsy hanakana ny frontend anao.
Ny asa tohanan'ny aptdcon
dia:
- havaozy
, -c
: Ity dia mitovy amin'ny fanavaozana apt-get
. Izy io dia manavao ny lisitry ny fonosanao. - apetraka
, - esory
, - havaozy
, - hadiovana
, - -downgrade
. Ny tsirairay amin'izy ireo dia manao araka ny lazain'ny anarany avy. Ny anaran'ny fonosana (s) dia tsy maintsy atao. -i
, -r
, -u
, -p
: ireto ny safidy fohy ho an'ny rehetra, afa-tsy ny fidinana ifotony, izay tsy manana iray. - safe-upgrade
, - fanavaozana feno
no mpifaninana amin'ny apt-get
's fanavaozana
/ dist-upgrade
ary ny aptitude
's safe-upgrade
/ fanavaozana feno
. Tsy mila masontsivana ireo. aptd
. Misy ny safidy mifanindry amin'izay apt-key
, apt-cache
, dpkg
. apt-get
mihitsy no tsy manohana fomba toy izany (hiandrasana tranga hafa apt), noho izany ny aptdcon
no vahaolana tian'ireo mpitantana fonosana GUI: USC dia mampiasa aptd
toy ny back-end, mitovy amin'ny Synaptic. Ny vahaolana hafa dia packagekit
, saingy tsy manohana ny fiasa tadiavinao (mbola).
Azonao atao ny mianatra apt-get
hianatra miandry raha toa ka mandeha ny manager software hafa. Zavatra mitovy amin'ny fihetsika avy amin'ny mpilalao manaraka:
Mamorona script vaovao antsoina hoe apt-get
(fonosana ho an'ny apt-get
) aho ao amin'ny lahatahiry / usr / local / sbin
miaraka amina kaody bash manaraka ao anatiny:
#!/bin/bash
i=0
tput sc
while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
case $(($i % 4)) in
0 ) j="-" ;;
1 ) j="\\" ;;
2 ) j="|" ;;
3 ) j="/" ;;
esac
tput rc
echo -en "\r[$j] Waiting for other software managers to finish..."
sleep 0.5
((i=i+1))
done
/usr/bin/apt-get "$@"
Aza adino ny mampihatra azy:
sudo chmod +x /usr/local/sbin/apt-get
Alohan'ny hitsapana dia jereo raha tsara daholo ny zava-drehetra. Ny fivoahan'ny izay apt-get
dia tokony ho / usr / local / sbin / apt-get
. Ny antony dia: amin'ny toerana misy anao, ny lahatahiry / usr / local / sbin
dia apetraka alohan'ny lahatahiry / usr / bin
ao amin'ny mpampiasa na root PATH
.
Вы можете использовать метод опроса:
$ time (while ps -opid= -C apt-get > /dev/null; do sleep 1; done); \
apt-get -y install some-other-package
Я создал скрипт, который делает это:
#!/bin/bash
# File path to watch
LOCK_FILE='/var/lib/dpkg/lock'
# tput escape codes
cr="$(tput cr)"
clr_end="$(tput el)"
up_line="$(tput cuu 1)"
CLEAN(){
# Cleans the last two lines of terminal output,
# returns the cursor to the start of the first line
# and exits with the specified value if not False
echo -n "$cr$clr_end"
echo
echo -n "$cr$clr_end$up_line"
if [[ ! "$1" == "False" ]]; then
exit $1
fi
}
_get_cmdline(){
# Takes the LOCKED variable, expected to be output from `lsof`,
# then gets the PID and command line from `/proc/$pid/cmdline`.
#
# It sets `$open_program` to a user friendly string of the above.
pid="${LOCKED#p}"
pid=`echo $pid | sed 's/[\n\r ].*//'`
cmdline=()
while IFS= read -d '' -r arg; do
cmdline+=("$arg")
done < "/proc/${pid}/cmdline"
open_program="$pid : ${cmdline[@]}"
}
# Default starting value
i=0
# Checks if the file is locked, writing output to $FUSER
while LOCKED="$(lsof -F p "$LOCK_FILE" 2>/dev/null)" ; do
# This will be true if it isn't the first run
if [[ "$i" != 0 ]]; then
case $(($i % 4)) in
0 ) s='-'
i=4
_get_cmdline # Re-checks the command line each 4th iteration
;;
1 ) s=\\ ;;
2 ) s='|' ;;
3 ) s='/' ;;
esac
else
# Traps to clean up the printed text and cursor position
trap "CLEAN False; trap - SIGINT ; kill -SIGINT $$" SIGINT
trap 'CLEAN $((128+15))' SIGTERM
trap 'CLEAN $((128+1))' SIGHUP
trap 'CLEAN $((128+3))' SIGQUIT
# Default starting character
s='-'
_get_cmdline
echo -n "$save_cur"
fi
# Prints the 2nd line first so the cursor is at the end of the 1st line (looks nicer)
echo
echo -n "$cr$clr_end$open_program"
echo -n "$up_line$res_cur$cr$clr_end[$s] Waiting for other package managers to finish..."
#echo -en "$cr$clr_end[$s] Waiting for other package managers to finish..."
#echo -en "\n$cr$clr_end$open_program$cr$up_line"
((i++))
sleep 0.025
done
CLEAN False
# This allows saving the script under a different name (e.g. `apt-wait`)
# and running it. It only imitates `apt-get` if it was launched as such
if [[ "${0##*/}" == 'apt-get' ]]; then
exec /usr/bin/apt-get "$@"
exit $?
fi
Сохраните вышесказанное в /usr/local/sbin/apt-get
. Затем apt-get
будет ждать, если другой экземпляр уже запущен.
Или сохраните его как /usr/local/sbin/apt-wait
, пример использования:
apt-wait && aptitude
, который запустит aptitude
после того, как текущий процесс, удерживающий блокировку, завершится.
Пример выполнения:
Сначала выполняется команда
apt-get
, например:$ sudo apt-get remove some_package
Затем в другом терминале выполняется другая команда:
$ sudo apt-get install some_other_package
Он будет ждать окончания первой команды, а затем бежать. Выход в ожидании:
.[/] Ждем, пока другие менеджеры пакетов закончат... 28223 : /usr/bin/apt-get delete some_package
Один -liner на основе Ответ Оли :
while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do sleep 1; done
К сожалению, fuser мало что делает для вас, когда вы работаете в различных непривилегированных контейнерах пространства имен, таких как lxc.
Кроме того, по умолчанию aptdcon не установлен (по крайней мере, на 18.04), а фоновый рисунок вашей задачи находится в очереди, так что вы теряете сериализацию. Это не является непреодолимым, но это означает, что автоматизация должна иметь какой-то способ избежать ошибок флока в apt при установке aptdcon, и у вас должны быть какие-то циклы ожидания для всего, что вам нужно сериализовать после установки пакетов через aptdcon, если только для этого уже нет какого-то флага.
Что работает, так это флок. Это также должно работать над NFS и т.д., так как использует блокировку файловой системы так же, как и apt, только с параметром -w секунд он будет ждать на вашей блокировке вместо того, чтобы бросать ошибку.
Так что, следуя модели обертки, добавьте это как apt-get в /usr/local/bin/ и разделите.
Это также имеет преимущество ограничения ввода-вывода, не разрешая параллельность на apt, так что вы можете позволить cron запускать обновления в полночь везде без избиения диска.
#!/bin/bash
exec /usr/bin/flock -w 900 -F --verbose /var/cache/apt/archives/lock /usr/bin/apt-get $@
Очень приятным и простым запросом функции apt-get был бы флаг -w для переключения на блокировку / ожидание блокировки.
В зависимости от того, обертываете ли вы все обращения к apt-get
или нет, это может сработать:
flock ./apt.lock apt-get install ...
Создайте свой собственный замок с помощью flock (1)
вместо попытки перехвата различных блокировок dpkg
.