web-dev-qa-db-fra.com

Comment puis-je fermer toutes les fenêtres avec un script?

Je veux fermer toutes les fenêtres en cours d'exécution en exécutant un script Shell (tout comme ouvrir plusieurs applications en exécutant un script), mais je ne sais pas comment. Comment puis-je atteindre cet objectif?

4
quangtruong1985

Vous voudrez peut-être utiliser wmctrl -c. Si vous essayez de fermer gedit par exemple, il vous sera demandé si vous souhaitez enregistrer des fichiers non sauvegardés.

WIN_IDs=$(wmctrl -l | awk '$3 != "N/A" {print $1}')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
5
user55822

Inspiré par la réponse donnée par user55822, j'ai créé un script spécifiquement pour être utilisé dans l'environnement de bureau Xfce, mais il pourrait être adapté pour être utilisé sur n'importe quel bureau à l'aide d'un gestionnaire de fenêtres qui interagit correctement avec wmctrl .

Mon script nécessite une étape supplémentaire pour attendre que toutes les fenêtres soient réellement fermées. Ainsi, si elles sont appelées depuis un autre script, elles ne seront pas renvoyées trop tôt. Voici mon script pour fermer toutes les fenêtres ouvertes autres que les panneaux et le bureau lui-même:

WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed 
while [ $WIN_IDs ]; do 
    sleep 0.1; 
    WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

Pour l'adapter à un bureau autre que Xfce, vous devez remplacer grep -vwE "Desktop $ | xfce4-panel $" par tout ce qui fonctionne sur ce bureau. Ce que fait cette partie du script réduit les résultats de wmctrl -l pour ne rien inclure se terminant par le mot "Bureau" ou "xfce4-panel". Donc, pour l'adapter, lancez simplement wmctrl -l et cherchez ce qu'il y a à la fin des lignes pour les fenêtres que vous voulez rester ouvertes. Sur Xfce au moins, il finit par lister le bureau lui-même comme une fenêtre, de sorte que sans la commande grep, il se déconnecte de Xfce.

2
Colin Keenan

Problème difficile, mais je me suis trompé :) J'ai beaucoup cherché sur le Web et j'ai abouti à une solution.

Le script bash suivant, dans un premier temps, lit tous les identifiants des fenêtres ouvertes, puis convertit chacun de ces identifiants pour traiter les PID. Enfin, il convertit tous les PID en noms de processus. Il génère à la fois les PID et les noms de processus.

Voici le script:

#!/bin/bash
#Script by the whole web. I wrote it but it's not mine
#creating a temp file
temp1=$(mktemp)
#Getting all the windows' IDs and writing them to a file (CREDITS TO http://stackoverflow.com/questions/2250757/is-there-a-linux-command-to-determine-the-window-ids-associated-with-a-given-pro)
xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }' > $temp1;
#reading every window ID and converting it to a PID & writing it to a file... (CREDITS TO http://www.linuxquestions.org/questions/programming-9/getting-the-pid-of-the-top-active-window-776938/)
temp2=$(mktemp)
while read id; do
   xprop -id "$id" |  awk '/_NET_WM_PID\(CARDINAL\)/{print $NF}' >> $temp2
done < $temp1
#removing temp1
rm -f $temp1
#another temp file
temp3=$(mktemp)
#removing duplicate entries from $temp2 file: (CREDITS TO http://www.unix.com/Shell-programming-scripting/20364-remove-duplicate-lines-file.html)
uniq $temp2 > $temp3
#removing temp2
rm -f $temp2
#!!! Outputting the PIDs: !!!
echo "The following PIDs were found:"
cat $temp3

#!!! Optional: getting their process names: !!! (CREDITS TO http://info.w3calculator.com/free-code/linux/how-to-get-process-name-from-pid/)
echo "The above PIDs have the following names:"
while read pid; do
   cat /proc/$pid/cmdline
   #newline
   echo
done < $temp3
#removing the last temp file...
rm -f $temp3

La sortie de ce script sur ma machine, avec ettercap-gtk open, chrome, 2 fenêtres gnome-terminal et gedit, la sortie est:

The following PIDs were found:
9401
11194
1671
9401
10446
9401
10446
11194
10446
10434
9401
1653
1813
1671
1813
1454
1813
1653
1813
2340
2005
1996
1840
1809
1813
1809
1666
1781
1637
1773
1761
1653
1637
1653
1671
1669
1663
1653
1650
1649
1454
1400
1637
1653
1671
9401
The above PIDs have the following names:
/usr/lib/chromium-browser/chromium-browser
gedit/home/alex/Documents/macs
gnome-terminal-e/home/alex/Documents/WALLCH/start wait exec
/usr/lib/chromium-browser/chromium-browser
/usr/sbin/ettercap--gtk
/usr/lib/chromium-browser/chromium-browser
/usr/sbin/ettercap--gtk
gedit/home/alex/Documents/macs
/usr/sbin/ettercap--gtk
gksudo/usr/sbin/ettercap --gtk
/usr/lib/chromium-browser/chromium-browser
nautilus-n
/usr/lib/unity/unity-panel-service
gnome-terminal-e/home/alex/Documents/WALLCH/start wait exec
/usr/lib/unity/unity-panel-service
/usr/lib/gnome-settings-daemon/gnome-settings-daemon
/usr/lib/unity/unity-panel-service
nautilus-n
/usr/lib/unity/unity-panel-service
update-notifier
telepathy-indicator
/usr/lib/gnome-disk-utility/gdu-notification-daemon
/usr/lib/indicator-printers/indicator-printers-service
/usr/bin/gtk-window-decorator
/usr/lib/unity/unity-panel-service
/usr/bin/gtk-window-decorator
/home/alex/.dropbox-dist/dropbox
/usr/bin/gnome-screensaver--no-daemon
compiz
/usr/lib/bamf/bamfdaemon
/usr/lib/notify-osd/notify-osd
nautilus-n
compiz
nautilus-n
gnome-terminal-e/home/alex/Documents/WALLCH/start wait exec
bluetooth-applet
nm-applet
nautilus-n
/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
/usr/lib/gnome-settings-daemon/gnome-fallback-mount-helper
/usr/lib/gnome-settings-daemon/gnome-settings-daemon
gnome-session--session=ubuntu
compiz
nautilus-n
gnome-terminal-e/home/alex/Documents/WALLCH/start wait exec
/usr/lib/chromium-browser/chromium-browser

Comme vous pouvez le constater, non seulement les fenêtres ouvertes sont affichées, mais également tout ce qui ressemble à une interface graphique, comme nm-applet. Donc, si j'étais vous, je mettrais au clair chaque processus qui est évident qu'il ne devrait pas être tué, et je tuerais tout le reste!

Vous pouvez aussi à nouveau 'uniq' pour ne pas tuer les doublons ...

2
hytromo