Preventing Lubuntu 18.04 from leaving a user process running after the user logs out
September 23, 2019 Leave a comment
My family’s desktop machine has Lubuntu 18.04 installed, which uses systemd and the LXDE desktop environment. Each family member has their own user account, thus the installation is a single-seat, multi-user installation. For each user’s account I set up the virus-checking scheme described in an earlier post, suitably modified to take into account the differences between Lubuntu 18.04 and Gentoo Linux running KDE. For example, the monitorDownloadsGUI script in Lubuntu 18.04 uses zenity rather than kdialog, and, as Lubuntu 18.04 uses systemd, the ClamAV daemon’s service file in Lubuntu 18.04 is /lib/systemd/system/clamav-daemon.service
rather than the OpenRC init file /etc/init.d/clamd
used in my Gentoo Linux installations.
The virus-checking script ~/.monitorDownloadGUI
in each user’s home directory is launched automatically by LXDE at login because I created a Desktop Configuration File ~/.config/autostart/monitorDownloadsGUI.desktop
in each user’s account. For example, the contents of the file in my account are as follows:
[Desktop Entry] Type=Application Exec=/home/fitzcarraldo/.monitorDownloadsGUI
However, I recently noticed that Lubuntu 18.04 does not terminate the monitorDownloadsGUI
process when the user logs out. I do not see this behaviour on my laptops running Gentoo Linux with OpenRC and KDE, so I am not sure why this is happening in Lubuntu 18.04 with systemd and LXDE. The output of the ‘ps -ef
‘ command after each of the three example steps shown below illustrates the behaviour.
Step 1. george
is the only user who is logged-in.
$ ps -ef | grep bash | grep -v grep
george 1410 1 0 02:05 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
george 1597 1358 0 02:05 pts/0 00:00:00 /bin/bash
Step 2. ringo
uses ‘Logout’ > ‘Switch User’ to login to his account.
$ ps -ef | grep bash | grep -v grep
george 1410 1 0 02:05 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
george 1597 1358 0 02:05 pts/0 00:00:00 /bin/bash
ringo 2382 1 0 02:06 ? 00:00:00 /bin/bash /home/ringo/.monitorDownloadsGUI
Step 3. ringo
logs out of his account.
$ ps -ef | grep bash | grep -v grep
george 1410 1 0 02:05 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
george 1597 1358 0 02:05 pts/0 00:00:00 /bin/bash
ringo 2382 1 0 02:06 ? 00:00:00 /bin/bash /home/ringo/.monitorDownloadsGUI
Notice that the process with PID 2382 is still running, even though user ringo
is no longer logged in.
If a user logs out and logs in again, or if users switch between sessions using ‘Logout’ > ‘Switch User’, it is also possible for multiple instances of the script per user to be running. For example:
$ ps -ef | grep bash | grep -v grep
george 1564 1 0 11:14 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
ringo 2522 1 0 11:16 ? 00:00:00 /bin/bash /home/ringo/.monitorDownloadsGUI
george 3803 1 0 11:17 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
george 5997 1 0 11:19 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
george 6054 5881 0 11:19 pts/0 00:00:00 /bin/bash
Notice that several instances of the script are running for user george
. There should only be one instance.
In order to prevent these multiple instances, I added the shell script lines below to the existing LightDM session-cleanup-script
that I had created previously to solve a different problem in the Lubuntu 18.04 installation (see an earlier blog post).
# Get rid of duplicate instances (if any) per user of the virus-checker script's process who -u | grep -v "\." > /tmp/logged-in_users while IFS=: read -r f1 f2 f3 f4 f5 f6 f7 # $f1 is username # $f2 is password ('x') # $f3 is UID # $f4 is GID # $f5 is UID info # $f6 is home directory # $f7 is command/shell do match=0 while read a b c d e f g h # Use this if this script is launched by LightDM in Lubuntu 18.04 # while read a b c d e f g # Use this if you launch this script from a terminal in Lubuntu 18.04 # # If this script is launched by a user, 'who -u' returns the following fields: # "john tty7 2019-08-31 17:08 00:01 1624 (:0)" # If this script is launched by LightDM, 'who -u' returns the following fields: # "john tty7 Aug 31 17:08 00:01 1624 (:0)" # do if [[ $f6 == *"/home/"* ]] && [[ $f7 == "/bin/bash" ]] && [[ $a == $f1 ]]; then match=1 user=$f1 tty=$b fi done < /tmp/logged-in_users if [[ $match -eq 1 ]] && [[ $(echo $tty | sed 's/[^0-9]*//g') -gt 6 ]]; then if [[ `ps -ef | grep bash | grep "$user" | grep monitorDownloadsGUI | awk -F' ' '{print $2}' | wc -l` -gt 1 ]]; then kill `ps -ef | grep bash | grep "$user" | grep monitorDownloadsGUI | awk -F' ' '{print $2}' | tail -n +2` fi elif [[ $match -ne 1 ]]; then if [[ $f6 == *"/home/"* ]] && [[ $f7 == "/bin/bash" ]] && [[ `ps -ef | grep bash | grep "$f1" | grep monitorDownloadsGUI | awk -F' ' '{print $2}' | wc -l` -gt 1 ]]; then kill `ps -ef | grep bash | grep "$f1" | grep monitorDownloadsGUI | awk -F' ' '{print $2}' | tail -n +2` elif [[ $f6 == *"/home/"* ]] && [[ $f7 == "/bin/bash" ]] && [[ `ps -ef | grep bash | grep "$f1" | grep monitorDownloadsGUI | awk -F' ' '{print $2}' | wc -l` -eq 1 ]]; then kill `ps -ef | grep bash | grep "$f1" | grep monitorDownloadsGUI | awk -F' ' '{print $2}'` fi fi done < /etc/passwd rm /tmp/logged-in_users
The above lines of Bash script kill additional instances of monitorDownloadGUI
on a per-user basis when a user session ends. If LightDM’s session-cleanup-script
does this, there will be no more than one instance of a monitorDownloadsGUI
process per logged-in user, and no instances of a monitorDownloadGUI
process for users who have logged out:
$ ps -ef | grep bash | grep -v grep
george 1473 1 0 12:32 ? 00:00:00 /bin/bash /home/george/.monitorDownloadsGUI
george 1693 1412 0 12:32 pts/0 00:00:00 /bin/bash
Problem solved. Well, worked around. I would like to know what causes the problem to happen in the first place. I assume it is either systemd or LXDE.