LINUX.ORG.RU

Firefox падает

 , ,


1

2

Добрый вечер, лоровцы.

Столкнулся с проблемой - запускаю для тестов на основе Selenium одновременно 40 копий Firefox из под разных программ(разных PID, в смысле), вижу что появляются процессы в системе, но с подписью

[defunct]

И выкидывается исключение:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 77, in __init__
    self.binary, timeout),
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 49, in __init__
    self.binary.launch_browser(self.profile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 68, in launch_browser
    self._wait_until_connectable()
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 103, in _wait_until_connectable
    raise WebDriverException("Can't load the profile. Profile "
WebDriverException: Message: Can't load the profile. Profile Dir: %s If you specified a log_file in the FirefoxBinary constructor, check it for details.

Запилил цикл, который ловит исключение, и пытается заново запустить браузер - уходит в бесконечное выполнение. в /tmp/ появляется куча каталогов вида tmp*, содержащие профили Firefox. Пытался включить логи с помощью firefox_binary - ничего внятного не получил. Написано только что инсталлит дополнения некие, и всё, исключение. Если запускать 10 копий программы с 10 копиями Firefox - то всё работает хорошо.

Firefox - 31 версия, selenium - последняя. Python - 2.7.

Очень хотелось бы разобраться, уже голова пухнет.

нет опыта с селениумом, но предположу что ему места не хватает в tmpfs чтоб развернуть 40 профилей. Возможно сморозил глупость

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

Инодов тоже хватает, так что дело не в этом. Дело в чём-то другом, непонятном.

gIiIjony ()

инсталлит дополнения некие

Снеси дополнения эти.
А вообще надо на свежей версии тестить, а не на допотопной.
Сейчас актуальны 39.0.3, бера 40 и альфа 41. Всё остальное — ССЗБ.

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

Дак это дополнения вроде для управление браузером из webdriver. Пробовал до 36, но что-то мне кажется что на любой версии такая же фигня. Но сейчас попробую.

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

Попробовал альфу 40 - та же фигня. Правда в списке процессов уже нет defunct.

Последние логи браузера, перед исключением(тестил уже бету):

1439307184906   addons.xpi      DEBUG   Updating XPIState for {"id":"{972ce4c6-7e08-4474-a285-3208198ce6fd}","syncGUID":"4xaID0F38sPt","location":"app-global","version":"40.0","type":"theme","internalName":"classic/1.0","updateURL":null,"updateKey":null,"optionsURL":null,"optionsType":null,"aboutURL":null,"iconURL":null,"icon64URL":null,"defaultLocale":{"name":"Default","description":"The default theme.","creator":"Mozilla","homepageURL":null,"contributors":["Mozilla Contributors"]},"visible":true,"active":true,"userDisabled":false,"appDisabled":false,"descriptor":"/home/opt/firefox-40/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}","installDate":1438305245000,"updateDate":1438305245000,"applyBackgroundUpdates":1,"skinnable":true,"size":5022,"sourceURI":null,"releaseNotesURI":null,"softDisabled":false,"foreignInstall":false,"hasBinaryComponents":false,"strictCompatibility":true,"locales":[],"targetApplications":[{"id":"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}","minVersion":"40.0","maxVersion":"40.0"}],"targetPlatforms":[]}
1439307184906   addons.xpi      DEBUG   getModTime: Recursive scan of {972ce4c6-7e08-4474-a285-3208198ce6fd}
1439307184907   addons.xpi      DEBUG   Updating database with changes to installed add-ons
1439307184907   addons.xpi-utils        DEBUG   Updating add-on states
1439307184908   addons.xpi-utils        DEBUG   Writing add-ons list
1439307184918   addons.manager  DEBUG   Registering shutdown blocker for XPIProvider
1439307184919   addons.manager  DEBUG   Provider finished startup: XPIProvider
1439307184919   addons.manager  DEBUG   Starting provider: LightweightThemeManager
1439307184919   addons.manager  DEBUG   Registering shutdown blocker for LightweightThemeManager
1439307184919   addons.manager  DEBUG   Provider finished startup: LightweightThemeManager
1439307184920   addons.manager  DEBUG   Starting provider: GMPProvider
1439307184925   addons.manager  DEBUG   Registering shutdown blocker for GMPProvider
1439307184925   addons.manager  DEBUG   Provider finished startup: GMPProvider
1439307184925   addons.manager  DEBUG   Starting provider: PluginProvider
1439307184926   addons.manager  DEBUG   Registering shutdown blocker for PluginProvider
1439307184926   addons.manager  DEBUG   Provider finished startup: PluginProvider
1439307184926   addons.manager  DEBUG   Completed startup sequence
1439307201712   addons.manager  DEBUG   Starting provider: <unnamed-provider>
1439307201712   addons.manager  DEBUG   Registering shutdown blocker for <unnamed-provider>
1439307201713   addons.manager  DEBUG   Provider finished startup: <unnamed-provider>
1439307210355   DeferredSave.extensions.json    DEBUG   Starting write
1439307210531   addons.repository       DEBUG   No addons.json found.
1439307210531   DeferredSave.addons.json        DEBUG   Save changes
1439307210539   DeferredSave.addons.json        DEBUG   Starting timer
1439307210556   addons.manager  DEBUG   Starting provider: PreviousExperimentProvider
1439307210556   addons.manager  DEBUG   Registering shutdown blocker for PreviousExperimentProvider
1439307210557   addons.manager  DEBUG   Provider finished startup: PreviousExperimentProvider
1439307210568   DeferredSave.extensions.json    DEBUG   Write succeeded
1439307210568   addons.xpi-utils        DEBUG   XPI Database saved, setting schema version preference to 17

Глянул с помощью strace - перед исключением делает много:

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 12
fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(12, {sa_family=AF_INET, sin_port=htons(38425), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=12, events=POLLOUT}], 1, 1000) = 1 ([{fd=12, revents=POLLOUT|POLLERR|POLLHUP}])
getsockopt(12, SOL_SOCKET, SO_ERROR, [111], [4]) = 0
close(12)                               = 0
waitpid(21051, 0xbff51bc8, WNOHANG)     = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 12
fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(12, {sa_family=AF_INET, sin_port=htons(38425), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=12, events=POLLOUT}], 1, 1000) = 1 ([{fd=12, revents=POLLOUT|POLLERR|POLLHUP}])
getsockopt(12, SOL_SOCKET, SO_ERROR, [111], [4]) = 0
close(12)                               = 0
waitpid(21051, 0xbff51bc8, WNOHANG)     = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 12
fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(12, {sa_family=AF_INET, sin_port=htons(38425), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=12, events=POLLOUT}], 1, 1000) = 1 ([{fd=12, revents=POLLOUT|POLLERR|POLLHUP}])
getsockopt(12, SOL_SOCKET, SO_ERROR, [111], [4]) = 0
close(12)                               = 0
waitpid(21051, 0xbff51bc8, WNOHANG)     = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 12
fcntl64(12, F_GETFL)                    = 0x2 (flags O_RDWR)
fcntl64(12, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(12, {sa_family=AF_INET, sin_port=htons(38425), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=12, events=POLLOUT}], 1, 1000) = 1 ([{fd=12, revents=POLLOUT|POLLERR|POLLHUP}])
getsockopt(12, SOL_SOCKET, SO_ERROR, [111], [4]) = 0
close(12)                               = 0
waitpid(21051, 0xbff51bc8, WNOHANG)     = 0
kill(21051, SIGKILL)                    = 0
waitpid(21051, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], 0) = 21051

Правда особо не понимаю что это значит.

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

С 39 та же история. Получше было с 26, но после 50 всё-равно всё валилось.

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

Надо или альфу 41 пробовать или бету 40.
Или стабильную 39.

Запускай каждую лису от отдельного пользователя с изолированными tmp и профилями.

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

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

39 стабильную пробовал - та же фигня.

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

Попробовал запустить 20 Firefox от одного юзера, и 1 от Рута - все свалились. Руту поставил TMPDIR=/var/tmp/, увидел как создался каталог с профилем, и словил то же исключение. Видимо такой вариант не прокатит. :(

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

40 стабильную попробуй, отрелизили буквально недавно.
Лимита на количество юзеров кроме как в винде и в айфоне вроде нет нигде больше.

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

Стабильную версию попробовал - то же самое. Попробую каждую копию Firefox из под отдельного юзера, авось.

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

Это не вопрос виртуальности, это просто правило работы всех браузеров.
Исключением могут быть только консольные.

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

А что плохого может быть(не считая дальнейших возможных проблем, запущенных вредоносных программ, которые пролезли через корявый браузер, и замусорили систему, например), когда запускаешь браузер от рута?

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

Неожиданная для браузера структура дерева дирректорий и прибитое гвоздями правило падать если есть доступ куда не надо.

Goury ★★★★★ ()

включено ли создание coredump? Если нет, то надо включить. При падениях они будут создаваться и можно будет увидеть, на чем оно валиться.

Jaeger1999 ()

В общем, не знаю в чём оказалась именно проблема - даунгрейднул Selenium до 2.45.0 - всё заработало, вместе с Firefox 31.8. Сейчас тесты погоняю, и скажу так ли всё на самом деле.

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

Нет, не включено. Решение(костыльное) проблемы описал ниже.

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

Ну падает же оно от чего-то.
Не факт конечно что от этого, но для проверки стоит попробовать.

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

Такое ощущение, что ему банально файловых дескрипторов не хватает. Попробуй в /etc/security/limits.conf для пользователя, под которым тесты пускаешь, лимиты увеличить.

cherry-pick ()
Ответ на: комментарий от gIiIjony

И проверь, хватает ли ему портов из net.ipv4.ip_local_port_range - может статься, что у тебя банально так много подключений открыто, что портов не хватает.

cherry-pick ()
Ответ на: комментарий от cherry-pick

Я выше писал, что в моей программе есть цикл, который обрабатывает WebDriverException, и перезапускает браузер до тех пор, пока тот не перезапустится. Через некоторое время работы такого скрипта в /tmp/ появляется несколько сотен тысяч каталогов с профилями Firefox. Так что всего ему хватает.

gIiIjony ()
Ответ на: комментарий от cherry-pick

Выше тоже отписал, что даунгрейднув Selenium до 2.45.0 всё заработало. Сейчас проверяю на 100 копиях Firefox, летает хорошо. Некоторые браузеры валятся опять же с «Can't load the profile», но потом всё-таки перезапускаются.

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