Как заставить менеджер пакетов ждать, если запущен другой экземпляр APT?

Я видел много программ, таких как Update Manager и Synaptic Package Manager, они ждут, если какая-то другая программа использует /var/lib/dpkg/lock и будет заблокирована. Как мы можем сделать это через Терминал? Я видел руководство apt-get, но не нашел ничего полезного.

63
задан 21 April 2014 в 18:26

9 ответов

Вы можете использовать команду aptdcon Manpage icon для постановки задач диспетчера пакетов в очередь путем взаимодействия с aptdaemon вместо прямого использования apt-get.

Таким образом, вы можете просто выполнить sudo aptdcon --install chromium-browser или что-то еще, и пока эта команда запущена, вы можете запустить ее снова, но установить другие пакеты, и apt-daemon просто поставит их в очередь ошибки.

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

39
ответ дан 21 April 2014 в 18:26

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 ...

23
ответ дан 21 April 2014 в 18:26

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.
  • Misy hetsika maro hafa, izay hita ao amin'ny boky torolàlana. Saingy, ireo no mpampiasa be mpampiasa indrindra liana amin'ny 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).

21
ответ дан 21 April 2014 в 18:26

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:

enter image description here

Ahoana no nahavitako azy?

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 .

48
ответ дан 21 April 2014 в 18:26

Вы можете использовать метод опроса:

$ time (while ps -opid= -C apt-get > /dev/null; do sleep 1; done); \
  apt-get -y install some-other-package
3
ответ дан 21 April 2014 в 18:26

Я создал скрипт, который делает это:

#!/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 после того, как текущий процесс, удерживающий блокировку, завершится.

Пример выполнения:

  1. Сначала выполняется команда apt-get, например:

    $ sudo apt-get remove some_package
    
  2. Затем в другом терминале выполняется другая команда:

    $ sudo apt-get install some_other_package
    

    Он будет ждать окончания первой команды, а затем бежать. Выход в ожидании:

    .
      [/] Ждем, пока другие менеджеры пакетов закончат...
     28223 : /usr/bin/apt-get delete some_package
    
3
ответ дан 21 April 2014 в 18:26

Один -liner на основе Ответ Оли :

while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do sleep 1; done
3
ответ дан 22 November 2019 в 23:51

К сожалению, 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 для переключения на блокировку / ожидание блокировки.

3
ответ дан 22 November 2019 в 23:51

В зависимости от того, обертываете ли вы все обращения к apt-get или нет, это может сработать:

flock ./apt.lock apt-get install ...

Создайте свой собственный замок с помощью flock (1) вместо попытки перехвата различных блокировок dpkg .

0
ответ дан 5 January 2021 в 23:42

Другие вопросы по тегам:

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