LINUX.ORG.RU

[НЕНАВИСТ] firefox не обрабатывает нормально SIGTERM


0

0

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

если перед openbox --exit выполнять killall forefox-bin, то ничего не меняется — он сигтерм нормально не обрабатывает.

в иксах есть аналог виндозного WM_CLOSE? ведь по Alt-F4 фокс выходит нормально. как из консоли его послать программе?

с другой стороны нагуглил browser.sessionstore.max_resumed_crashes:

The number of crashes that can occur before the «about:sessionrestore» page is displayed. Default is 1 (the last session is automatically restored once). Note: This preference has no effect if more than 6 hours have passed since the last crash.

то есть, даже если прописать там 9000, то после выключения на ночь, оно все равно будет предлагать восстановить сессию.

как быть?

★★★★

Погуглить, как это делается во всяких гномах. У меня, например, гном даже предлагает дождаться повисших програм

Divius ★★
()
Ответ на: комментарий от Divius

>У меня, например, гном даже предлагает дождаться повисших програм

Как меня это бесит, если сказано «Выключить» - значит ДЕ должно взять и завершиться, и неважно что какая-то программа не обрабатывает SIGTERM. Не понимает SIGTERM - прибить SIGKILL'ом.

winlogon
()
Ответ на: комментарий от isden

пробовал.


короче, нагуглил что с помощью obxprop можно получить список окон, а с помощью wmctrl окно можно закрыть нормально по айди. так что вопрос закрыт — напишу себе скриптик.

moot ★★★★
() автор топика
Ответ на: комментарий от Dimanc

ну у меня во первых процесс называется firefox-bin, а во вторых он-то выходит, но считает что это был креш. попробуй два раза его запустить и убить killall'ом (или один раз и подождать 6 часов) — на следующем запуске он предложит восстановить сессию.

moot ★★★★
() автор топика
Ответ на: комментарий от moot

Действительно, сейчас убил - восстановление сессии, а до этого все нормально было, странно...

Dimanc ★★
()

>в иксах есть аналог виндозного WM_CLOSE?

man wmctrl

Hetor
()
Ответ на: комментарий от xorik
#!/bin/sh

TIME_TO_WAIT=30

CLIENTS=""
WINDOWS=`obxprop --root _NET_CLIENT_LIST | awk -F= '{ print $2; }' | tr -d ","`
for ID in $WINDOWS; do
        WINDOW_TYPE=`obxprop --id $ID _NET_WM_WINDOW_TYPE`
        if [ -z "$WINDOW_TYPE" -o `echo $WINDOW_TYPE | grep _NET_WM_WINDOW_TYPE_NORMAL | wc -l` -eq 1 ]; then
                CLIENTS="$CLIENTS $ID"
        fi
done

if [ -n "$CLIENTS" ]; then
        for ID in $CLIENTS; do
                wmctrl -ia $ID
                wmctrl -ic $ID

                TIME=`date +%s`
                while [ `date +%s` -le `expr $TIME + $TIME_TO_WAIT` ]; do
                        if [ `obxprop --root _NET_CLIENT_LIST | grep $ID | wc -l` -eq 0 ]; then
                                break
                        fi
                done
        done
fi

openbox --exit

осторожней копируй — там очень длинные строки получились. сохрани где-то в $PATH как openbox-session-close и сделай chmod a+x на него.

в ~/.config/openbox/menu.xml замени стандартное

  <item label="Log Out">
    <action name="Exit">
      <prompt>yes</prompt>
    </action>
  </item>
на
  <item label="Log Out">
    <action name="Execute">
      <command>openbox-session-close</command>
    </action>
  </item>
скрипт ждет до $TIME_TO_WAIT секунд на каждом окне. например, пока несохраненный gedit показывает диалог «сохранить файл». окна типа док (fbpanel) или десктоп (conky) игнорируются. на других не проверял еще, но должно работать. в конце опенбокс завершается, так что окна, которые добровольно не закрылись, умрут по-любому.

moot ★★★★
() автор топика
Ответ на: комментарий от xorik

можно его заменить на xprop. но там другой формат строки в _NET_CLIENT_LIST. исправить или сам заменишь? xprop-то и wmctrl есть?

moot ★★★★
() автор топика

Это конечно скорее всего баг. Но просто запретить восстанавливать сессию после креша, тем более что эта фича довольно сомнительна?
about:config
browser.sessionstore.resume_from_crash

Booster ★★
()
Ответ на: комментарий от xorik

ну, через гуи не труЪ :) кроме того, оно вроде не умеет запрос подтверждения добавлять. типа такого:

  <item label="Log Out">
    <action name="Execute">
      <command>openbox-session-close</command>
      <prompt>Are you sure you want to log out?</prompt>
    </action>
  </item>

moot ★★★★
() автор топика
Ответ на: комментарий от Booster

немножко красноглазия еще никому не вредило :)

moot ★★★★
() автор топика

> а мне лень руками закрывать все окна перед логаутом.

File->Quit/Ctrl+Q закрывает все окна сразу

olegsov
()
Ответ на: комментарий от olegsov

все равно лень :) я хочу в опенбоксе выбрать logout или halt и чтобы все корректно закрылось, а не умерло в страшных муках

moot ★★★★
() автор топика
Ответ на: комментарий от moot

как оказалось, опенбокс у меня сегфолтится если <prompt> в команду добавить... так что может через гуи и лучше

moot ★★★★
() автор топика

update: xprop по-другому несуществующие параметры окон возвращает. вот обновленный скрипт (заодно научил перезагружать и выключать комп):

#!/bin/sh

TIME_TO_WAIT=30
SLEEP=0.25

CLIENTS=""
WINDOWS=`xprop -root _NET_CLIENT_LIST | awk -F# '{ print $2; }' | tr -d ","`
for ID in $WINDOWS; do
        WINDOW_TYPE=`xprop -id $ID _NET_WM_WINDOW_TYPE`
        TYPE_NOT_SET=`echo $WINDOW_TYPE | grep "not found" | wc -l`
        TYPE_NORMAL=`echo $WINDOW_TYPE | grep _NET_WM_WINDOW_TYPE_NORMAL | wc -l`
        if [ $TYPE_NOT_SET -eq 1 -o $TYPE_NORMAL -eq 1 ]; then
                CLIENTS="$CLIENTS $ID"
        fi
done

if [ -n "$CLIENTS" ]; then
        for ID in $CLIENTS; do
                wmctrl -ia $ID
                sleep $SLEEP
                wmctrl -ic $ID

                TIME=`date +%s`
                while [ `date +%s` -le `expr $TIME + $TIME_TO_WAIT` ]; do
                        sleep $SLEEP
                        if [ `xprop -root _NET_CLIENT_LIST | grep $ID | wc -l` -eq 0 ]; then
                                break
                        fi
                done
        done
fi

case $1 in
-r)
        sudo reboot
        ;;
-h)
        sudo halt -p
        ;;
*)
        openbox --exit
esac

подытоживая тред: если вы хотите, чтобы при выходе из опенбокса все программы вежливо закрывались (а не умирали, когда иксы завершатся):
— положите скрипт в $PATH
— установите xprop, wmctrl и sudo
— настройте sudo на запуск без пароля reboot и halt -p.
— добавьте в ~/.config/openbox/menu.xml (в <menu id=«root-menu»> или в подменю):

  <item label="Reboot">
    <action name="Execute">
      <command>openbox-session-close -r</command>
    </action>
  </item>
  <item label="Halt">
    <action name="Execute">
      <command>openbox-session-close -h</command>
    </action>
  </item>
  <item label="Log Out">
    <action name="Execute">
      <command>openbox-session-close</command>
    </action>
  </item>
ну или воспользуйтесь obmenu. параметры скрипта: -h — halt, -r — reboot, без параметров — логаут.

moot ★★★★
() автор топика

Ставь нормальный браузер (Opera).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.