How can I make apt-get wait for another instance to finish? [duplicate]
You can make apt-get
to learn to wait if another software manager is running. Something similar with the behaviour from the next screen cast:
How I made it?
I create a new script called apt-get
(wrapper for apt-get
) in /usr/local/sbin
directory with the following bash code inside:
#!/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 "$@"
Don't forget to make it executable:
sudo chmod +x /usr/local/sbin/apt-get
Before to test, check if everything is ok. The output of which apt-get
command should be now /usr/local/sbin/apt-get
. The reason is: by default, the /usr/local/sbin
directory is placed before /usr/bin
directory in user or root PATH
.
You can use the aptdcon
command to queue up package manager tasks by communicating with aptdaemon instead of using apt-get directly.
So basically you can just do sudo aptdcon --install chromium-browser
or whatever and while that command is running you can run it again but install different packages and apt-daemon will just queue them up instead of erroring out.
This is especially useful if you're doing a long upgrade or something and want to keep installing packages or if you're scripting something together and want to make sure installing things will be more reliable.
A very simple approach would be a script that waited for the lock to not be open. Let's call it waitforapt
and stick it in /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
Then just run sudo waitforapt && sudo apt-get install whatever
. You could add exceptions into sudoers
to allow you to run it without needing a password (you'll need it for the apt-get
so it's no great gain).
Unfortunately this doesn't queue things. Given that some of apt's operations are interactive ("Are you sure you want to remove all those packages?!"), I can't see a good way around this...
Apart of the obvious &&
, you may be looking for aptdcon
. This tool is able to detect other instances of apt and wait them to finish:
sudo aptdcon --safe-upgrade [/] 11% Waiting for other software managers to quit Waiting for aptitude
(I'm running aptitude somewhere else)
The advantage of this tool is that you can stock several actions consecutively without being worried of what you will be doing next. aptdcon
is ideal for unattended scripts, and GUI installation, since you can allow the tool run in background as not to block your frontend.
The operations supported by aptdcon
are:
-
--refresh
,-c
: This is the equivalent toapt-get update
. It updates your package list. -
--install
,--remove
,--upgrade
,--purge
,--downgrade
. Each of them do as their names say. The name of the package(s) is mandatory.-i
,-r
,-u
,-p
: these are the short options for all except downgrade, who doesn't have one. -
--safe-upgrade
,--full-upgrade
are the counterparts toapt-get
'supgrade
/dist-upgrade
andaptitude
'ssafe-upgrade
/full-upgrade
. These doesn't need parameters. - There are several others operations, which can be found in the manual. But, these are the most used by users interested in
aptd
. There are options that overlap with whatapt-key
,apt-cache
,dpkg
do.
apt-get
itself doesn't support such methods (to wait for other instances of apt), so aptdcon
is the preferred solution to GUI's package managers: USC uses aptd
as back-end, same as Synaptic. Other solution is packagekit
, but it doesn't support the function that you are looking for (yet).