Как стать автором
Обновить

Отложенный перезапуск Firefox: интерактивный и автоматические способы

Время на прочтение4 мин
Количество просмотров3.1K
Бывают случаи, когда Firefox приходится оставлять надолго без присмотра (например, в нём работает расширение, собирающее критические новости, или встроенный торрент-клиент, или даже мини-сервер). Не секрет, что со временем работы браузера растёт потребление памяти. Рано или поздно система может почувствовать дискомфорт. Поэтому хорошо бы иметь возможность задавать браузеру отложенные задания на перезапуск. Возможны как минимум три вида таких заданий.



1. Единичный перезапуск по требованию пользователя


Сначала устанавливаем расширение Custom Buttons. Оно позволяет создавать на панели инструментов кнопки для выполнения произвольного кода (причём код будет привилегированным, с правами расширения). По сути, это фреймворк для быстрого создания мини-расширений.

После установки создаём кнопку и в первую вкладку настроек этой кнопки вводим следующий код:

var timeout = prompt("Введите количество минут до перезапуска:", "1440");
if (timeout) {
	window.setTimeout("Application.restart();", timeout * 60 * 1000);
}

В диалоге, вызываемом нажатием кнопки, можно ввести количество минут до перезапуска. По умолчанию заданы сутки.



2. Безусловный периодический перезапуск без вмешательства пользователя


Если браузер предоставляется самому себе на особо длительный период, возможно, придётся прибегнуть к многократным периодическим перезапускам. Для этого во вторую вкладку настроек новосозданной кнопки (вкладка «Инициализация») нужно ввести следующий код:

var timeout = 1440; //minutes
window.setTimeout("Application.restart();", timeout * 60 * 1000);

После каждого запуска браузера будет начинаться отсчёт времени, заданного параметром timeout. Опять-таки по умолчанию определён перезапуск раз в сутки, но пользователь может заменить число 1440 на любое другое (не введите случайно слишком маленький интервал (дробь), иначе придётся разбираться с последствиями в безопасном режиме).

Если нужен перезапуск в указанное время, а не через указанный период, здесь есть подходящее решение.



3. Условный периодический перезапуск без вмешательства пользователя


К предыдущему способу мы можем добавить проверку одного из подходящих условий. Рассмотрим два: период простоя браузера и объём занимаемой памяти.

А. Проверяем время неактивности пользователя

Функция каждую минуту будет проверять время неактивности, и, если оно превысит параметр idleLimit (задаётся в минутах), браузер перезапустится.

var idleLimit = 60; //minutes
var idleService =
	 Components.classes["@mozilla.org/widget/idleservice;1"]
	.getService(Components.interfaces.nsIIdleService);
window.setInterval(
	function() {
		if (idleService.idleTime / 60000 > idleLimit) {
			Application.restart();
		}
	},
	60000
);

Б. Проверяем объём памяти

Тут всё немого сложнее. Поиск в MDC не дал документированных интерфейсов для получения подобной информации. Но в Firefox 3.6 появилась страница about:memory. Анализ её кода приводит к файлу chrome://global/content/aboutMemory.js, в котором используются несколько опять-таки недокументированных интерфейсов. При их помощи можно рискнуть на такой код (функция перебирает доступные типы памяти, и, если хотя бы один из них превысит установленный лимит (задаётся в мегабайтах), браузер перезапустится):

var memoryLimit = 200; //megabytes
var enumeratedReporters =
	 Components.classes["@mozilla.org/memory-reporter-manager;1"]
	.getService(Components.interfaces.nsIMemoryReporterManager)
	.enumerateReporters();
while (enumeratedReporters.hasMoreElements()) {
	if (
		 enumeratedReporters.getNext()
		.QueryInterface(Components.interfaces.nsIMemoryReporter)
		.memoryUsed / 1000000
			> memoryLimit
	) {
		Application.restart();
	}
}

Однако неизвестно, как используемые интерфейсы зависят от операционных систем (в сети встречаются упоминания о том, что about:memory не работает в Linux). Также непонятно, в какой версии Firefox появились эти интерфейсы. Поэтому был бы благодарен читателям, если бы они смогли протестировать следующий код и в комментариях отписались бы о том, что он выдаёт на разных OC и в разных версиях Firefox (постарайтесь не повторять конфигурации, о которых уже отписались):

try {
	
	var enumeratedReporters =
		 Components.classes["@mozilla.org/memory-reporter-manager;1"]
		.getService(Components.interfaces.nsIMemoryReporterManager)
		.enumerateReporters();
	
	var report = "";
	
	while (enumeratedReporters.hasMoreElements()) {
		var memoryReporter =
			enumeratedReporters.getNext()
			.QueryInterface(Components.interfaces.nsIMemoryReporter);
			
		report +=
			memoryReporter.path + ":\t" +
			memoryReporter.memoryUsed / 1000000 + "\n";
	}
	
	alert(report || "Memory information not available.");
	
} catch(error) {alert(error)}

В. Объединяем обе проверки

Функция каждую минуту проверяет время простоя. Когда оно превысит лимит, функция каждую минуту начнёт проверять размер памяти. Когда и этот лимит будет превышен, браузер перезапустится.

var idleLimit = 60; //minutes
var memoryLimit = 200; //megabytes

var idleService =
	 Components.classes["@mozilla.org/widget/idleservice;1"]
	.getService(Components.interfaces.nsIIdleService);
var reporterManager = 
	 Components.classes["@mozilla.org/memory-reporter-manager;1"]
	.getService(Components.interfaces.nsIMemoryReporterManager);

window.setInterval(
	function() {
		if (idleService.idleTime / 60000 > idleLimit) {
			var enumeratedReporters = reporterManager.enumerateReporters();
			while (enumeratedReporters.hasMoreElements()) {
				if (
				   enumeratedReporters.getNext()
				  .QueryInterface(Components.interfaces.nsIMemoryReporter)
				  .memoryUsed / 1000000
					> memoryLimit
				) {
					Application.restart();
				}
			}		
		}
	},
	60000
);



Остаётся добавить, что перед заданием перезапусков стоит отключить проверку обновлений браузера и расширений (или по крайней мере сделать обновления автоматическими), иначе диалоги обновления могут блокировать работу Firefox после очередного перезапуска.
Теги:
Хабы:
+17
Комментарии56

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн