update-motd - dynamic MOTD generation
Contents
Best Practices
MOTD fragments must be scripts in /etc/update-motd.d, must be executable, and must emit information on
standard out.
Scripts should be named named NN-xxxxxx where NN is a two digit number indicating their position in the
MOTD, and xxxxxx is an appropriate name for the script.
Scripts must not have filename extensions, per run-parts(8) --lsbsysinit instructions.
Packages should add scripts directly into /etc/update-motd.d, rather than symlinks to other scripts, such
that administrators can modify or remove these scripts and upgrades will not wipe the local changes.
Consider using a simple shell script that simply calls exec on the external utility.
Long running operations (such as network calls) or resource intensive scripts should cache output, and
only update that output if it is deemed expired. For instance:
/etc/update-motd.d/50-news
#!/bin/sh
out=/run/foo
script="w3m -dump http://news.google.com/"
if [ -f "$out" ]; then
# Output exists, print it
echo
cat "$out"
# See if it's expired, and background update
lastrun=$(stat -c %Y "$out") || lastrun=0
expiration=$(expr $lastrun + 86400)
if [ $(date +%s) -ge $expiration ]; then
$script > "$out" &
fi
else
# No cache at all, so update in the background
$script > "$out" &
fi
Scripts should emit a blank line before output, and end with a newline character. For instance:
/etc/update-motd/05-lsb-release
#!/bin/sh
echo
lsb-release -a
Description
UNIX/Linux system administrators often communicate important information to console and remote users by
maintaining text in the file /etc/motd, which is displayed by the pam_motd(8) module on interactive shell
logins.
Traditionally, this file is static text, typically installed by the distribution and only updated on
release upgrades, or overwritten by the local administrator with pertinent information.
Ubuntu introduced the update-motd framework, by which the motd(5) is dynamically assembled from a
collection of scripts at login.
Executable scripts in /etc/update-motd.d/* are executed by pam_motd(8) as the root user at each login,
and this information is concatenated in /run/motd.dynamic. The order of script execution is determined
by the run-parts(8) --lsbsysinit option (basically alphabetical order, with a few caveats).
On Ubuntu systems, /etc/motd is typically a symbolic link to /run/motd.dynamic.
Files
/etc/motd, /run/motd.dynamic, /etc/update-motd.d
Name
update-motd - dynamic MOTD generation
See Also
motd(5), pam_motd(8), run-parts(8)
Synopsis
/etc/update-motd.d/*
