Как закрыть все открывающиеся окна скриптом?

Я хочу закрыть все открывающиеся окна, выполнив сценарий оболочки (как открыть несколько приложений, выполнив сценарий), но я не знаю как. Как мне этого добиться?

4
задан 07.05.2020, 03:16

3 ответа

Вдохновленный ответом пользователя 55822, я создал скрипт, специально предназначенный для использования в среде рабочего стола Xfce, но его можно адаптировать для использования на любом рабочем столе, используя оконный менеджер, который правильно взаимодействует с wmctrl [ 111].

Мой сценарий делает дополнительный шаг, чтобы подождать, пока все окна фактически не закроются, чтобы при вызове из другого сценария он не возвращался слишком рано. Вот мой скрипт для закрытия всех открытых окон, кроме панелей и самого рабочего стола:

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 "Рабочий стол $ | xfce4-panel $ " со всем, что работает на этом рабочем столе. То, что делает эта часть скрипта, сужает результаты wmctrl -l , чтобы они не включали ничего, заканчивающегося словом «Desktop» или «xfce4-panel». Таким образом, чтобы адаптировать его, вы просто должны запустить wmctrl -l и посмотреть, что находится в конце строк для окон, которые вы хотите оставить открытыми. По крайней мере, в Xfce он перечисляет рабочий стол как окно, так что без команды grep он выходит из Xfce.

2
ответ дан 07.05.2020, 03:16

Вы можете использовать wmctrl -c. Например, если вы пытаетесь закрыть gedit, он спросит вас, хотите ли вы сохранить несохраненные файлы.

WIN_IDs=$(wmctrl -l | awk '$3 != "N/A" {print $1}')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
5
ответ дан 07.05.2020, 03:17

Сложная проблема, но я ее обманул :) Я много искал в сети и нашел решение.

Следующий скрипт 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, вывод:

[ 111]

Как видите, выводятся не только открытые окна, но и все, что похоже на GUI, например, на nm-апплет. Итак, на вашем месте я бы отключил все процессы, которые, очевидно, не должны быть убиты, а затем убил бы все остальное!

Вы также можете снова «uniq», чтобы не уничтожать дубликаты. вещи ...

2
ответ дан 07.05.2020, 03:17
  • 1
    Необходимо проверить другой ответ также: Это намного более просто и легко для понимания. – gauee 07.05.2020, 03:18

Теги

Похожие вопросы