Как закрыть все открывающиеся окна скриптом?
Я хочу закрыть все открывающиеся окна, выполнив сценарий оболочки (как открыть несколько приложений, выполнив сценарий), но я не знаю как. Как мне этого добиться?
3 ответа
Вы можете использовать wmctrl -c
, Например, если вы пытаетесь закрыть gedit, он спросит вас, хотите ли вы сохранить несохраненные файлы.
WIN_IDs=$(wmctrl -l | awk '$3 != "N/A" {print $1}')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
Сложная проблема, но я ее обманул:) Я много искал в Интернете и нашел решение.
Следующий скрипт bash сначала считывает идентификаторы всех открытых окон, а затем конвертирует каждый из идентификаторов для обработки идентификаторов PID. Наконец, он преобразует все PID в имена процессов. Он выводит как PID, так и имена процессов.
Вот сценарий:
#!/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
Вывод этого скрипта на моей машине, с ettercap-gtk open, chromium, 2 окнами gnome-терминала и gedit, вывод:
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
Как видите, выводятся не только открытые окна, но и все, что похоже на GUI, например, nm-applet. Так что, будь я на твоем месте, я бы отключил каждый процесс, который, очевидно, его не следует убивать, а затем я бы убил все остальное!
Вы также можете снова "uniq", чтобы не убивать повторяющиеся вещи...
Вдохновленный ответом пользователя 55822, я создал скрипт, специально предназначенный для использования в среде рабочего стола Xfce, но его можно адаптировать для использования на любом рабочем столе, используя оконный менеджер, который правильно взаимодействует с wmctrl.
Мой сценарий делает дополнительный шаг, чтобы дождаться закрытия всех окон, чтобы при вызове из другого сценария он не возвращался слишком рано. Вот мой скрипт для закрытия всех открытых окон, кроме панелей и самого рабочего стола:
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
Чтобы адаптировать его для рабочего стола, отличного от Xfce, вам нужно заменить grep -vwE "Desktop$|xfce4-panel$" на все, что работает на этом рабочем столе. То, что делает эта часть скрипта, сужает результаты wmctrl -l, чтобы они не включали ничего, заканчивающееся словом "Рабочий стол" или "xfce4-панель". Таким образом, чтобы адаптировать его, вы просто должны запустить wmctrl -l и посмотреть, что находится в конце строк для окон, которые вы хотите оставить открытыми. По крайней мере, в Xfce он перечисляет рабочий стол как окно, так что без команды grep он выходит из Xfce.