Update Manager 및 Synaptic Package Manager와 같은 많은 소프트웨어를 보았습니다. 다른 프로그램에서를 사용 /var/lib/dpkg/lock
중이고 잠겨 있으면 기다립니다 . 터미널을 통해 어떻게 할 수 있습니까? 나는 apt-get
매뉴얼을 보았지만 유용한 것을 찾지 못했습니다.
답변
apt-get을 직접 사용하는 대신 aptdaemon과 통신 하여 aptdcon
명령 을 사용 하여 패키지 관리자 태스크를 큐에 넣을 수 있습니다.
기본적으로 당신은 sudo aptdcon --install chromium-browser
무엇이든 할 수 있고 그 명령이 실행되는 동안 다시 실행할 수는 있지만 다른 패키지를 설치하면 apt-daemon은 오류 대신 대기열에 넣습니다.
이것은 긴 업그레이드 나 무언가를하고 패키지를 계속 설치하고 싶거나 함께 스크립팅하고 설치의 안정성을 높이고 자 할 때 특히 유용합니다.
답변
apt-get
다른 소프트웨어 관리자가 실행중인 경우 대기하는 방법을 배울 수 있습니다 . 다음 화면 캐스트의 동작과 비슷한 내용 :
어떻게 만들었습니까?
다음 bash 코드가 있는 디렉토리에 apt-get
(wrapper for apt-get
) 라는 새 스크립트를 만듭니다 /usr/local/sbin
.
#!/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 "$@"
실행 파일로 만드는 것을 잊지 마십시오 :
sudo chmod +x /usr/local/sbin/apt-get
테스트하기 전에 모든 것이 정상인지 확인하십시오. which apt-get
명령 의 출력은 이제되어야합니다 /usr/local/sbin/apt-get
. 그 이유는 다음과 같습니다. 기본적으로 디렉토리는 user 또는 root의 디렉토리 /usr/local/sbin
앞에 있습니다./usr/bin
PATH
답변
명백한 것 외에도 &&
, 당신은 찾고 있을지도 모릅니다 aptdcon
. 이 도구는 apt의 다른 인스턴스를 감지하고 완료 될 때까지 기다릴 수 있습니다.
sudo aptdcon-안전한 업그레이드 [/] 11 % 다른 소프트웨어 관리자가 종료하기를 기다리는 중 적성을 기다리는 중
(나는 다른 곳에서 적성을 달리고있다)
이 도구의 장점은 다음에 수행 할 작업에 대해 걱정하지 않고 여러 작업을 연속으로 저장할 수 있다는 것입니다. aptdcon
프론트 엔드를 차단하지 않도록 백그라운드에서 도구를 실행할 수 있으므로 무인 스크립트 및 GUI 설치에 이상적입니다.
지원되는 작업 aptdcon
은 다음과 같습니다.
--refresh
,-c
: 이것은와 같습니다apt-get update
. 패키지 목록을 업데이트합니다.--install
,--remove
,--upgrade
,--purge
,--downgrade
. 그들 각자는 그들의 이름이 말하는대로합니다. 패키지 이름은 필수입니다.-i
,-r
,-u
,-p
:이 하나가없는 외 모두 다운 그레이드에 대한 짧은 옵션이 있습니다.--safe-upgrade
,--full-upgrade
대응 부에있는apt-get
의upgrade
/dist-upgrade
와aptitude
의safe-upgrade
/이full-upgrade
. 이들은 매개 변수가 필요하지 않습니다.- 매뉴얼에서 찾을 수있는 몇 가지 다른 작업이 있습니다. 그러나에 관심이있는 사용자가 가장 많이 사용합니다
aptd
. 무엇과 중복 옵션이 있습니다apt-key
,apt-cache
,dpkg
할 수는.
apt-get
자체적으로는 이러한 방법을 지원하지 않으며 (다른 인스턴스의 인스턴스를 기다림) aptdcon
GUI 패키지 관리자에게 선호되는 솔루션이 있습니다. USC는 aptd
Synaptic과 같은 백엔드로 사용합니다 . 다른 솔루션은입니다 packagekit
.하지만 찾고있는 기능을 아직 지원하지 않습니다.
답변
매우 간단한 방법은 잠금이 열리지 않기를 기다리는 스크립트입니다. 전화해서 waitforapt
꽂아 봅시다 /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
그런 다음 실행하십시오 sudo waitforapt && sudo apt-get install whatever
. sudoers
암호를 요구하지 않고 실행할 수 있도록 예외를 추가 할 수 있습니다 (필요 apt-get
하므로 큰 이득이 아닙니다).
불행히도 이것은 대기하지 않습니다. apt의 작업 중 일부가 대화식이라는 점을 고려하면 ( “모든 패키지를 제거 하시겠습니까?!”)이 문제를 해결하는 좋은 방법은 없습니다.
답변
폴링 기술을 사용할 수 있습니다.
$ 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
첫 번째 명령이 완료되고 실행되기를 기다립니다. 기다리는 동안 출력 :
[/] Waiting for other package managers to finish... 28223 : /usr/bin/apt-get remove some_package
답변
불행히도 lxc와 같은 권한이없는 다른 네임 스페이스 컨테이너에서 실행할 때 퓨저는 많은 도움이되지 않습니다.
또한 aptdcon은 기본적으로 설치되어 있지 않으며 (최소한 18.04 이상) 작업을 대기열에 배치하므로 직렬화가 손실됩니다. 이것은 극복 할 수 없지만 aptdcon을 설치할 때 aptdcon을 설치할 때 자동으로 무리 오류를 피할 수있는 방법이 필요하다는 것을 의미하며 aptdcon을 통해 패키지를 설치 한 후 직렬화 해야하는 모든 것에 대해 일종의 대기 루프가 필요합니다 이미 어떤 종류의 깃발이 없다면.
작동하는 것은 무리입니다. 이것은 apt와 동일한 방식으로 파일 시스템 잠금을 사용하므로 NFS 등에서도 작동해야합니다. -w seconds 매개 변수 만 사용하면 오류를 발생시키는 대신 잠금을 기다립니다.
랩퍼 모델에 따라 / usr / local / bin /에 apt-get으로 추가하고 공유하십시오.
또한 apt에서 병렬 처리를 허용하지 않음으로써 IO를 제한하는 이점이 있으므로 디스크를 두드리지 않고 자정에 cron이 업데이트를 트리거 할 수 있습니다.
#!/bin/bash
exec /usr/bin/flock -w 900 -F --verbose /var/cache/apt/archives/lock /usr/bin/apt-get $@
apt-get에 대한 매우 훌륭하고 간단한 기능 요청은 차단 / 대기 잠금으로 전환하기위한 -w 플래그입니다.