≡ Menu

How to run a command or script after running apt-get command on a Debian or Ubuntu Linux

How do I run custom command after ‘apt-get upgrade‘ or ‘apt-get dist-upgrade‘ on a Debian or Ubuntu Linux based system? How do I hook a script to apt-get command on my Ubuntu Linux server?

You can configure the apt-get command using /etc/apt/apt.conf file or place configuration in a special directory at /etc/apt/apt.conf.d/. The following two options allows you to run shell commands or script before/after invoking dpkg/apt-get tools:

DPkg::Post-Invoke

The syntax is:

# This is a list of shell commands to run after invoking dpkg/apt-get #
DPkg::Post-Invoke {"command";};
DPkg::Post-Invoke {"/path/to/sbin/command";};
DPkg::Post-Invoke {"/path/to/script";};

DPkg::Pre-Invoke

The syntax is:

# This is a list of shell commands to run before invoking dpkg/apt-get #
DPkg::Pre-Invoke {"command";};
DPkg::Pre-Invoke {"/path/to/sbin/command";};
DPkg::Pre-Invoke {"/path/to/script";};

Like options this must be specified in list notation. The commands are invoked in order using /bin/sh; should any fail APT will abort.

Examples

In this example auto re-mounting of a readonly /use/ folder so that apt-get will work properly. Edit or create a file called /etc/apt/apt.conf.d/100update:
$ sudo vi /etc/apt/apt.conf.d/100update
Append/edit as follows:

   Pre-Invoke {"/bin/mount -o remount,rw /usr/";};
   Post-Invoke {"/bin/mount -o remount,ro /usr/";};

Another example:

  Update
  {
     Pre-Invoke {"touch /var/lib/apt/pre-update-stamp"; };
     Post-Invoke {"touch /var/lib/apt/post-update-stamp"; };
  };

Running or hooking a custom script to apt-get on a Debian or Ubuntu Linux server

In this example I want to run the following script (/root/bin/php7helper) so that I can patch config file upon running apt-get command:

#!/bin/bash
# Name: /root/bin/php7helper
# Purpose: A shell script to patch php 7 fpm on Ubuntu serer
# Author: Vivek Gite <www.cyberciti.biz> under GPL version 2+
# ------
function update_php7(){
	local u="cyberciti"  # new user name
	local r="www-data"   # old user name
	local f="/usr/lib/tmpfiles.d/php7.0-fpm.conf" # config file
	local wrcmd="/etc/init.d/lighttpd restart"    # restart services
	local prcmd="/etc/init.d/php7.0-fpm restart"
	# patch it
	echo "$0: Patching $f..."
	sed -i "s/$r/$u/g" $f  
	# restart it
	$prcmd
	$wrcmd
}
# main #
update_php7

Create a file called /etc/apt/apt.conf.d/80upgradehook:
$ cat /etc/apt/apt.conf.d/80upgradehook
Sample outputs:

DPkg::Post-Invoke {"/root/bin/php7helper";};

Now simply run the apt-get upgrade command and the script /root/bin/php7helper will get executed:
$ sudo apt-get upgrade
Sample outputs:

Fig.01: apt-get hook called a script called /root/bin/php7helper after running it

Fig.01: apt-get hook called a script called /root/bin/php7helper after running it

See man pages for more info – apt-get(8), apt.conf(5), dpkg(1)

Sysadmin because even developers need heroes!!!

Share this tutorial on:
{ 3 comments… add one }
  • juriskaste February 17, 2016, 2:12 pm

    Hi. I’ve never attempted to think of such scenario, yet .
    Interesting example though, thanks ! :)
    No offense, but I noticed a typo “You can configuration apt-get command” – shouldn’t it be “You can configure apt-get command” ?

  • Christian Rusa March 4, 2016, 7:03 am

    Thanks for this article gave me some ideas. :-)

    I guess the filename 100update in the example is supposed to put it as last file in the directory. As all the other files there only have two digits the file beginning with 100 ends up among the 10s in lexical order and not at the end.
    But not really an issue.

Security: Are you a robot or human?

Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">


   Tagged with: ,