Как я могу определить пустое окно?

Фон:

На запуске у меня есть это пустое разоблачение окна.

Снимок экрана:

Empty window

Вопрос:

Как я могу определить то, что производит это пустое окно и как я могу удалить его?

3
задан 3 October 2016 в 13:33

2 ответа

В намного большинстве случаев, открывая окно терминала, выполняет команду

xprop WM_CLASS

.. и впоследствии нажмите на окно, даст Вам достаточную информацию о процессе, который владеет окном.

В противном случае выполните команду (предполагающий, что Вы имеете wmctrl установленный):

wmctrl -lp

Выскажите образованное предположение на окне из списка, скопируйте строку в третьем столбце (его pid) и работайте:

ps -p 1337 -o comm=

где 1337 pid, который Вы просто скопировали. Вывод будет процессом, который владеет окном.

Если Вы не можете использовать терминал

.. Вы могли сохранить файл журнала, отслеживание:

  • появляющиеся новые ("НОВЫЕ") окна
  • закрытие окон
  • изодромные с предварением новые окна принадлежат и приложение, как это появляется в выводе ps -e
  • время появления/закрытия
#!/usr/bin/env python3
import subprocess
import time

#---set the path to the log file below
logfile = "window_log"
#---

# clear the file from previous runs
open(logfile, "wt").write("")

def get_wlist():
    try:
        return subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def get_wids(currlist):
    return [l.split()[0] for l in currlist.splitlines()]

def stamp(s):
    t = time.ctime()
    return (len(t)*"-")+"\n"+s+" "+t+("\n"+len(t)*"-")

def update_log(data):
    with open(logfile, "a+") as log:
        for l in data:
            log.write(str(l)+"\n")
        log.write("\n")

while True:
    # wait until the desktop is ready to run wmctrl
    wdata1 = get_wlist()
    if wdata1:
        break
    time.sleep(1)

# and then...
wlist1 = get_wids(wdata1)

while True:
    time.sleep(1)
    wdata2 = get_wlist()
    if wdata2:
        wlist2 = get_wids(wdata2)
        new = [w for w in wlist2 if not w in wlist1]
        for item in new:
            tstamp = stamp("NEW")
            line = wdata2.splitlines()[wlist2.index(item)]
            pid = line.split()[2]
            match = [p for p in subprocess.check_output(
                ["ps", "-e"]
                ).decode("utf-8").splitlines()\
                     if pid in p][0]
            update_log([tstamp, line, match])
        out = [w for w in wlist1 if not w in wlist2]
        for item in out:
            tstamp = stamp("OUT")
            line = wdata1.splitlines()[wlist1.index(item)]
            pid = line.split()[2]
            update_log([tstamp, line])
        wlist1 = wlist2; wdata1 = wdata2
  • Удостовериться wmctrl установлен

    sudo apt-get install wmctrl
    
  • Скопируйте сценарий в пустой файл, сохраните его как logwindows.py

  • Установите путь к файлу журнала в заголовке сценария
  • Запустите скрипт командой:

    python3 /path/to/logwindows.py
    
  • При необходимости добавьте его для запущения приложений, если окно только появляется вскоре после запуска

Сценарий производит файл журнала как:

------------------------
NEW Tue Oct  4 17:14:12 2016
------------------------
0x04400007  0 8427   jacob-System-Product-Name Ubuntu
 8427 ?        00:00:01 apport-gtk

------------------------
NEW Tue Oct  4 17:14:28 2016
------------------------
0x04e00084  0 8530   jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
 8530 ?        00:00:00 gedit

------------------------
NEW Tue Oct  4 17:14:31 2016
------------------------
0x0108deb3  0 2013   jacob-System-Product-Name Persoonlijke map
 2013 ?        00:04:20 nautilus

------------------------
NEW Tue Oct  4 17:14:39 2016
------------------------
0x05200085  0 0                            N/A QLE Quicklist Editor
    1 ?        00:00:02 systemd

------------------------
OUT Tue Oct  4 17:14:55 2016
------------------------
0x05200085  0 0                            N/A QLE Quicklist Editor

Так как Вы не можете управлять временем, окно появляется, но можно управлять временем, которое оно закрывает, это должно дать Вам достаточную информацию об окне в любой ситуации.

4
ответ дан 1 December 2019 в 13:16

Ответ на первую половину Вашего вопроса How can I identify what produces this empty window, с открытым окном, открывает Terminal и тип xlsclients:

dell  bamfdaemon
dell  ibus-ui-gtk3
dell  ibus-x11
dell  unity-settings-daemon
dell  unity-panel-service
dell  indicator-printers-service
dell  indicator-keyboard-service
dell  unity-fallback-mount-helper
dell  polkit-gnome-authentication-agent-1
dell  nm-applet
dell  gnome-software
dell  nautilus
dell  compiz
dell  telepathy-indicator
dell  gnome-terminal-server
dell  update-notifier
dell  notify-osd
dell  hud-service
dell  google-chrome-stable
dell  conky

Затем закрывают окно и работают xlsclients снова. Процесс, выполняющий окно, будет одним (s) в первом списке, но не во втором.

Нахождение имени процесса является первым шагом к остановке его.

HTH.

4
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

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