Je viens de redémarrer mon Ubuntu, mais j'ai oublié qu'une machine virtuelle était ouverte en arrière-plan (une icône réduite dans la barre des tâches). Est-il possible de configurer Ubuntu de manière à ce que si une application définie par l'utilisateur est en cours d'exécution, un avertissement est alors émis avant le redémarrage/l'arrêt? J'utilise la version 16.04.
Le script ci-dessous surveille la présence de toutes les applications ou d'applications définies par l'utilisateur. Si cette présence est détectée, le système ne pourra pas s'éteindre via un dialogue graphique (la fermeture via la ligne de commande ne sera pas affectée car cette tâche est appliquée par le système. administrateurs qui savent ce qu'ils font).
Il y a 3 options:
-a
Surveillez toutes les applications ouvertes.
-c
Sélection graphique d'une application
-s
spécifie le fichier .desktop pour l'application en ligne de commande
-h
imprime la syntaxe et la liste des options.
L'option -c
ne convient que pour une session. Vous souhaitez simplement cliquer sur une fenêtre et la surveiller. Les options -a
et -s
doivent être ajoutées en tant qu'entrées de démarrage automatique à lancer lors de la connexion au système. L'option -s
peut être utilisée avec un chemin complet ou une partie de celui-ci, par ex. /usr/share/applications/firefox.desktop
ou firefox.desktop
sont également acceptables.
La source du script est disponible ici ou sur mon GitHub . Les utilisateurs peuvent obtenir le script en clonant l’ensemble du référentiel ou en utilisant
wget https://raw.githubusercontent.com/SergKolo/sergrep/master/safe_shutdown.sh && chmod +x safe_shutdown.sh
commande pour obtenir uniquement le script lui-même.
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected]
# Date: May 14th , 2016
# Purpose: Ensure that user closes all or specific
# running windows and exits without any work
# lost
# Written for: http://askubuntu.com/q/771227/295286
# Tested on: Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
ARGV0="$0"
ARGC=$#
_notify_user()
{
# Close the shutdown dialog and display
# graphical popup which will ask user's shutdown
# confirmation. If user clicks OK , we shutdown.
# If cancel - no action.
qdbus com.canonical.Unity \
/com/canonical/Unity/Session \
com.canonical.Unity.Session.CancelAction
if zenity --question --title='WARNING!' \
--text="You have running apps. Shutdown anyway ?" \
2> /dev/null
then
qdbus com.canonical.Unity \
/com/canonical/Unity/Session \
com.canonical.Unity.Session.Shutdown
fi
}
_get_running_apps()
{
# Gets list of .desktop files for each
# running app
qdbus org.ayatana.bamf \
/org/ayatana/bamf/matcher \
org.ayatana.bamf.matcher.RunningApplicationsDesktopFiles
}
_check_any_running()
{
# Among the running apps there's always one
# .desktop file, which is compiz.desktop.
# We want to know if there's anything besides that
if [ $( _get_running_apps | wc -l ) -gt 1 ];
then
_notify_user
fi
}
_check_specific_running()
{
# Get list of running apps and see if
# the .desktop file we got is on the list
if _get_running_apps | grep -q "$1"
then
_notify_user
fi
}
_select_app()
{
# xwininfo provides Nice interface which allows selecting
# a window. The rest is just simple parsing and passing
# around the XID of the app.
notify-send 'Select a window you would like to monitor '
XID=$(xwininfo -int | awk '/xwininfo: Window id/{print $4}')
APP=$(qdbus org.ayatana.bamf \
/org/ayatana/bamf/matcher \
org.ayatana.bamf.matcher.ApplicationForXid $XID )
qdbus org.ayatana.bamf \
"$APP" org.ayatana.bamf.application.DesktopFile
}
_print_usage()
{
cat <<EOF
safe_shutdown.sh [-a | -c |-s DESKTOP_FILE | -h ]
Options:
-a Monitor any open applications.
-c Graphically select an app
-s specify .desktop file for app on command line
-h print this text
Copyright Serg Kolo , 2016
EOF
}
parse_args()
{
if [ $ARGC -eq 0 ] ; then
printf "%s: No option specified\n Usage:\n" ${ARGV0##*/}
_print_usage
exit 1
fi
local OPTIND opt
while getopts "acs:" opt
do
case ${opt} in
a) FUNCTION="_check_any_running"
break
;;
c)
DESK_FILE=$(_select_app )
FUNCTION=" _check_specific_running $DESK_FILE "
break
;;
s) DESK_FILE=${OPTARG}
FUNCTION=" _check_specific_running $DESK_FILE "
break
;;
h) _print_usage
exit 0
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
shift $((OPTIND-1))
}
main()
{
# Basic idea is to let user chose what to do
# then monitor dbus for appropriate signal
# Once the RebootRequested signal is received
# then perform appropriate checks ( for a specific
# or all apps ).
local FUNCTION
parse_args "$@"
dbus-monitor --profile \
"interface='com.canonical.Unity.Session',type=signal" |
while read -r line;
do
case "$line" in
*RebootRequested*) $FUNCTION ;;
esac
done
}
main "$@"