Como posso fechar todas as janelas de abertura com um script?

4

Eu quero fechar todas as janelas de abertura executando um script de shell (como abrir vários aplicativos executando um script), mas não sei como. Como posso conseguir isso?

    
por quangtruong1985 21.07.2012 / 10:50

3 respostas

5

Você pode querer usar wmctrl -c . Se você estiver tentando fechar o gedit por exemplo, ele perguntará se você deseja salvar arquivos não salvos.

WIN_IDs=$(wmctrl -l | awk ' != "N/A" {print }')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
    
por user55822 22.07.2012 / 13:27
2

Problema difícil, mas eu enganei :) Pesquisei muito na web e acabei por uma solução.

O seguinte script bash, inicialmente, lê todos os IDs das janelas abertas e, em seguida, converte cada um dos IDs para processar os PIDs. Finalmente, ele converte todos os PIDs em nomes de processos. Ele produz tanto os PIDs quanto os nomes dos processos.

Aqui está o 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  }' > $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

A saída deste script na minha máquina, com as janelas ettercap-gtk open, chromium, 2 gnome-terminal e gedit, a saída é:

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

Como você pode ver, não apenas as janelas abertas estão sendo produzidas, mas também tudo como o GUI, como o nm-applet. Então, se eu fosse você, eu explicaria cada processo que é óbvio que não deveria ser morto, e então mataria todo o resto!

Você também pode novamente 'uniq' para não matar itens duplicados ...

    
por hytromo 21.07.2012 / 11:31
2

Inspirado na resposta dada por user55822, criei um script especificamente para ser usado no Xfce Desktop Environment, mas ele pode ser adaptado para ser usado em qualquer desktop usando um gerenciador de janelas que interaja corretamente com wmctrl .

Meu script dá um passo extra para aguardar até que todas as janelas estejam realmente fechadas, de modo que, se chamado de outro script, ele não retornará cedo demais. Aqui está o meu script para fechar todas as janelas abertas que não sejam painéis e o próprio Desktop:

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

Para adaptá-lo para um desktop diferente do Xfce, você precisaria substituir grep -vwE "Desktop $ | xfce4-panel $" com o que estiver na área de trabalho. O que essa parte do script está fazendo é restringir os resultados de wmctrl -l para não incluir nada que termine com a palavra "Desktop" ou "xfce4-panel". Então, para adaptá-lo, você executaria apenas wmctrl -l e procuraria o que há no final das linhas das janelas que você deseja manter abertas. Pelo menos no Xfce, ele acaba listando o Desktop como uma janela para que, sem o comando grep, ele acabe saindo do Xfce.

    
por Colin Keenan 13.04.2013 / 05:21

Tags