Как ускорить загрузку нового терминала?

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

Я не имею в виду запуск приложения Terminal, но для окон терминала запуска, например, когда я открываю новую вкладку.

У меня нет ничего в файле .bash_profile , и я запускаю rm -rf /private /var /log /asl /*. asl каждые 4 часа ( которые очищают те файлы, которые обычно делают терминал медленным).

В настоящее время, когда я открываю новую вкладку, она занимает 3-4 секунды, пока я не могу что-то запустить.

80 голосов | спросил Fernando 25 FebruaryEurope/MoscowbSat, 25 Feb 2012 23:01:58 +0400000000pmSat, 25 Feb 2012 23:01:58 +040012 2012, 23:01:58

10 ответов


79

Короткий ответ:

Проблема вызвана (потенциально) дорогостоящим поиском системного журнала ASL. Чтобы увидеть это в действии, запустите sudo fs_usage | grep 'asl. * login' в окне терминала, затем откройте новое окно терминала.

Чтобы решить эту проблему, настройте Terminal для запуска нестандартной оболочки:

  1. Создайте символическую ссылку на вашу предпочитаемую оболочку. Например: sudo ln -s /bin /bash /usr /local /bin /bash
  2. Откройте «Настройки терминала» и выберите вкладку «Общие».
  3. Выберите «Shells open with: Command» и введите символическую ссылку, созданную на шаге 1. Например. "/USR /местные /бен /Баш".

Примечание 1: Вам также может потребоваться добавить bash и -bash в список процессов в разделе «Параметры терминала> профили> Shell> Спросить перед закрытием» .

Примечание 2: /usr /local /bin доступен для записи в OS X 10.11 (El Capitan) Режим без рут.

Чтобы проверить исправление:

  • Откройте новое окно терминала.
  • "Последний вход:" not будет отображаться вверху
  • Откройте инспектор (команда + I) и выберите вкладку «Информация».
  • Команда должна читать login -pfq имя_пользователя /usr /bin /bash или login -pfql имя пользователя ...

Важно: если в команде входа не указан параметр -q , вы не устранили проблему.

Вы также можете использовать sudo fs_usage | grep 'asl. * login' , чтобы убедиться, что /var /log /asl не открывается при открытии нового окна терминала.

<сильный> Детали:

Здесь есть несколько ошибок.

Действительной причиной медленности является /usr /bin /login , который по умолчанию отображает дату вашего последнего входа. Чтобы получить эту последнюю дату входа, она ищет базу данных ASL (Apple System Log) в /var /log /asl /. Эти файлы журналов могут быть сильно фрагментированы, и именно эта фрагментация файла вызывает задержку при открытии нового окна или вкладки. (Ошибка 1)

Единственный способ подавить ASL-поиск последнего входа - передать параметр -q в /usr /bin /login . Файл .hushlogin также подавляет отображение «Последний вход», но он не подавляет дорогостоящий поиск ASL. (Ошибка 2)

Терминал всегда использует /usr /bin /login для запуска каждого нового окна /оболочки. Нет возможности запускать оболочку напрямую и нет возможности напрямую управлять параметрами, переданными в /usr /bin /login (ошибка 3).

Как выясняется, терминал передает параметр -q в /usr /bin /login , когда он настроен на использование нестандартного оболочка. (Ошибка 4)

Параметр -q - это то, что нам нужно, чтобы избежать проблемы, поэтому символическая ссылка на /usr /local /bin /bash .

ответил Darren 18 72012vEurope/Moscow11bEurope/MoscowSun, 18 Nov 2012 15:44:58 +0400 2012, 15:44:58
14

Мне нужно было перейти от оболочки входа в команду /bin /bash -il в настройках iTerm Предпочтения> Профили> Общие> Команда .

Мне понадобилась опция -l ( Сделать команду bash, как если бы она была вызвана в качестве оболочки входа ), добавленной для установки переменных окружения из ~ /.bash_profile

ответил butcheriftexas 11 J000000Saturday15 2015, 14:36:14
13

Создайте пустой файл в домашней папке с именем .hushlogin ; это значительно уменьшит время, необходимое для отображения вкладки Terminal.app.

Когда вы создаете новую вкладку «Терминал», вы проходите процесс входа в систему. Этот процесс включает в себя получение различной информации о вашем предыдущем сеансе входа в систему, сообщении дня и отображении системных сообщений. Это может стать источником значительных задержек. Попробуйте замалчивать эти сообщения, чтобы увидеть, исчезает ли задержка.

Вы можете создать файл .hushlogin в Terminal.app, используя следующую команду:

  touch ~ /.hushlogin
 

Файл вступает в силу немедленно.

Подробнее о файле .hushlogin и процессе входа в систему можно узнать в руководство по эксплуатации .

ответил Graham Miln 19 J0000006Europe/Moscow 2012, 19:12:42
4

OK У меня есть аналогичный вывод для Даррена, хотя и немного другого механизма профилирования (NB медленный вход в систему может все еще происходить в Йосемите).

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

Узнайте, какая команда выполняет обычные функции входа в систему

  $ ps -ef | grep login
 

Вы увидите что-то вроде login -pfl username /bin /bash -c exec -la bash /bin /bash

Создайте имя файла сценария profile_login.sh со следующим содержимым, добавив

-c ""

до конца обнаруженной команды, чтобы запросить немедленное возвращение bash с таким содержимым:

  login -pfl имя пользователя /bin /bash -c exec -la bash /bin /bash -c "" & amp;
sudo sample $! -mayDie # пробовать указанную выше команду
 

Сделать его исполняемым

$ chmod u + x profile_login.sh

и запустите его с помощью команды sudo ( sample )

$ sudo ./profile_login.sh

ОК, продолжайте и запустите. Например, сначала выполнив команду purge . На моей коробке я получил большой выходной график. В поисках «самых больших нумерованных филиалов» (обычно вверху) я увидел следующие два крупнейших нарушителей

Один из того, что называется pam_start , который открывается для открытия изображений pam auth lib

  +! 1068 pam_start (в libpam.2.dylib) + 132 [0x7fff97295ab0]
+! : 1066 openpam_dynamic (в libpam.2.dylib) + 120 [0x7fff97293d14]
+! : | +! 1042 coresymbolication_load_image (CSCppDyldSharedMemoryPage *, ImageLoader const *, unsigned long long) (в dyld) + 143 [0x7fff66725411]
+! : | +! : 1042 mach_msg_trap (в dyld) + 10 [0x7fff6674a472]
 

, а за ним иногда следует другой нарушитель getlastlogxbyname

  +! 583 getlastlogxbyname (в libsystem_c.dylib) + 212 [0x7fff92b3ef7a]
+! : 566 asl_file_open_read (в libsystem_asl.dylib) + 143 [0x7fff8c27030d]
+! : | 566 __open_nocancel (в libsystem_kernel.dylib) + 10 [0x7fff97b39012] +! : | 566 __open_nocancel (в libsystem_kernel.dylib) + 10 [0x7fff97b39012]
 

Итак, в основном, есть два правонарушителя. Один из них - pam (какой-то тип системы аутентификации), а другой - asl "обнаруживает ваш последний логин". Таким образом, очевидно, что just удаление ваших файлов /private /var /log /asl /*. Asl недостаточно. В любом случае загрузка пэда намного дороже на моей машине [SSD]. Не стесняйтесь запускать вышеуказанный скрипт и посмотреть, совпадает ли ваша система. Интересно, что исходный код для этих вызовов методов также доступен в Интернете, например openpam_dynamic

Если я последую за ответом Даррена и заменяю мои «оболочки с открытым» на то, что отличает от /bin /bash, я вижу следующие строки, используемые для запуска новых вкладок терминала:

  $ ps -ef | grep login
  ... login -pfql packrd /bin /bash -c exec -la bash /usr /bin /bash
 

Итак, если теперь я использую тот же трюк sample в новой команде входа

  login -pfql имя пользователя /bin /bash -c exec -la bash /usr /bin /bash -c "" & amp;
sudo sample $! -mayDie
 

генерируется намного меньшая stacktrace, самый большой нарушитель:

  + 8 pam_end (в libpam.2.dylib) + 190 [0x7fff97294ebb]
+! 6 coresymbolication_unload_image (CSCppDyldSharedMemoryPage *, ImageLoader const *) (в dyld) + 143 [0x7fff6e0f634f]
 

Я думаю, это связано с тем, что теперь используется параметр login -q. По-видимому, этот параметр пропускает как загрузку модулей pam , так и , просматривая последнее время входа (оба нарушителя). Согласно документам команды login , прикосновение к файлу ~ .hushlogin должно делать то же самое, но, видимо, это больше не работает [по крайней мере для меня с 10.10] .

Итак, в общем случае удаления /private/var/log/asl/*.asl недостаточно (в моем эксперименте он учитывал не более 1/3 фактического замедления, хотя, если у вас были файлы mores это может объяснить более высокий процент, я уверен).

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

UPDATE: кажется, что coresymbolication_load_image может по-прежнему занимать много времени, даже если вызывается login -pfql (предположительно, какой-либо модуль проверки подлинности pam или другой«набирать» на центральный сервер входа или какой-то нечетный, так что придется ждать ответа от третьего лица). Поэтому единственным реальным обходным решением, которое я нашел, является использование iTerm2 и изменение настроек -> профили -> общий -> Вместо этого выполните команду /bin /bash .

ответил rogerdpack 7 FebruaryEurope/MoscowbSat, 07 Feb 2015 01:57:59 +0300000000amSat, 07 Feb 2015 01:57:59 +030015 2015, 01:57:59
2

Это все о расследовании причины. Вы можете видеть, что делается, когда процесс начинается с ввода bash -x , который распечатает процесс запуска оболочки.

Лично я замечаю только задержку между активацией и деактивацией приложения и на первой вкладке, созданной после периода активности. Мне всегда кажется, что речь идет о перемещении страниц памяти.

ответил ismail 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 04:48:37 +0400000000amSun, 26 Feb 2012 04:48:37 +040012 2012, 04:48:37
2

Сократите свою историю до 4-10 тысяч строк и, возможно, попробуйте отказаться от всех сохраненных окон. Я видел, как они влияют на более медленные машины - особенно без SSD для хранения.

ответил bmike 8 AMpSun, 08 Apr 2012 08:23:38 +040023Sunday 2012, 08:23:38
1

В моем случае, после безуспешной попытки вышеперечисленного на моем рабочем компьютере, я обнаружил, что виновником было Active Directory. Исправление должно было перейти в Утилиту справочника и отредактировать настройки службы AD (дважды щелкните по значку " Active Directory "), чтобы включить« Создать мобильную учетную запись при входе в систему »:

Пользователи & amp; Панель «Параметры входа» и «Изменить» | «»> </a> </p></div>
					 
						<div class="ggl_top">
					<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
						<!-- sprosi_links -->
						<ins class="adsbygoogle"
						     style="display:block"
						     data-ad-client="ca-pub-9184974711681073"
						     data-ad-slot="3127038630"
						     data-ad-format="link"
						     data-full-width-responsive="true"></ins>
						<script>
						(adsbygoogle = window.adsbygoogle || []).push({});
					</script>
				</div>										<div class="whoanswered">ответил <a rel="nofollow" target="_blank" href="//apple.stackexchange.com/users/21650/david-moles">David Moles</a> <span>27 AM00000010000001031 2015, 01:33:10</span></div>
				</div>	
			</div>
					<div class="answer-item" itemscope itemtype="http://schema.org/Answer" itemprop="suggestedAnswer">
				<div class="answ-stat">
					<span class="avts " itemprop="upvoteCount">0</span>
				</div>
				<div class="answ-body">
					<div itemprop="text"><p> Просто запустите: </p>

<pre> <code> sudo creatbyproc.d
sudo newproc.d
</code> </pre>

<p> в отдельных терминалах и откройте новое открытое, чтобы увидеть, что выполняется в течение этого времени. </p>

<p> Если ничего очевидного, попробуйте следующее: </p>

<pre> <code> sudo dtruss -an Terminal
</code> </pre>

<p> Это приведет к печати всех ваших данных, которые происходят во время загрузки табуляции. </p></div>
										<div class="whoanswered">ответил <a rel="nofollow" target="_blank" href="//apple.stackexchange.com/users/22781/kenorb">kenorb</a> <span>26 MarpmThu, 26 Mar 2015 15:57:12 +03002015-03-26T15:57:12+03:0003 2015, 15:57:12</span></div>
				</div>	
			</div>
					<div class="answer-item" itemscope itemtype="http://schema.org/Answer" itemprop="suggestedAnswer">
				<div class="answ-stat">
					<span class="avts " itemprop="upvoteCount">0</span>
				</div>
				<div class="answ-body">
					<div itemprop="text"><p> Откройте <code> /etc /profile </code> и добавьте строку <code> PATH = "" </code>, чтобы она выглядела следующим образом: </p>

<pre> <code>, если [-x /usr /libexec /path_helper]; тогда
    PATH = ""
    eval `/usr /libexec /path_helper -s`
фи
</code> </pre></div>
										<div class="whoanswered">ответил <a rel="nofollow" target="_blank" href="//apple.stackexchange.com/users/65956/davidcondrey">davidcondrey</a> <span>23 J0000006Europe/Moscow 2015, 04:07:18</span></div>
				</div>	
			</div>
					<div class="answer-item" itemscope itemtype="http://schema.org/Answer" itemprop="suggestedAnswer">
				<div class="answ-stat">
					<span class="avts " itemprop="upvoteCount">0</span>
				</div>
				<div class="answ-body">
					<div itemprop="text"><p> Проблема для меня в том, что доменный сервер активного каталога недействителен. </p>

<p> Сменив его, перезагрузив макрос, он зафиксировал его. </p>

<p> <a href="https://i.stack.imgur.com/WCRW5.png" rel="nofollow noreferrer"> <img src = "https://i.stack.imgur.com/WCRW5. png "alt =" введите описание изображения здесь>> </a> </p></div>
					 
						<div class="ggl_top">
					<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
						<!-- sprosi_links -->
						<ins class="adsbygoogle"
						     style="display:block"
						     data-ad-client="ca-pub-9184974711681073"
						     data-ad-slot="3127038630"
						     data-ad-format="link"
						     data-full-width-responsive="true"></ins>
						<script>
						(adsbygoogle = window.adsbygoogle || []).push({});
					</script>
				</div>										<div class="whoanswered">ответил <a rel="nofollow" target="_blank" href="//apple.stackexchange.com/users/162722/user2707671">user2707671</a> <span>30 Jpm1000000pmMon, 30 Jan 2017 13:37:10 +030017 2017, 13:37:10</span></div>
				</div>	
			</div>
			</div>
</div>
<div id="rightside">
	<div>
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
		<!-- sprosi_sidebar -->
		<ins class="adsbygoogle"
		     style="display:block"
		     data-ad-client="ca-pub-9184974711681073"
		     data-ad-slot="3939859211"
		     data-ad-format="auto"
		     data-full-width-responsive="true"></ins>
		<script>
		(adsbygoogle = window.adsbygoogle || []).push({});
		</script>
	</div>
	<h3>Похожие вопросы</h3>
		<div id=poptags><h3>Популярные теги</h3><div id="poptags-wrap"><span><a href="/tag/security">security</a> × 330</span><span><a href="/tag/linux">linux</a> × 316</span><span><a href="/tag/macos">macos</a> × 282</span><span><a href="/tag/7">7</a> × 268</span><span><a href="/tag/performance">performance</a> × 244</span><span><a href="/tag/command-line">command-line</a> × 241</span><span><a href="/tag/sql-server">sql-server</a> × 235</span><span><a href="/tag/joomla-3.x">joomla-3.x</a> × 222</span><span><a href="/tag/java">java</a> × 189</span><span><a href="/tag/c%2B%2B">c++</a> × 186</span><span><a href="/tag/windows">windows</a> × 180</span><span><a href="/tag/cisco">cisco</a> × 168</span><span><a href="/tag/bash">bash</a> × 158</span><span><a href="/tag/c%23">c#</a> × 142</span><span><a href="/tag/gmail">gmail</a> × 139</span><span><a href="/tag/arduino-uno">arduino-uno</a> × 139</span><span><a href="/tag/javascript">javascript</a> × 134</span><span><a href="/tag/ssh">ssh</a> × 133</span><span><a href="/tag/seo">seo</a> × 132</span><span><a href="/tag/mysql">mysql</a> × 132</span></div></div></div>	</div>
	<footer>
		<div class="wrap">
			<div id="license">
				licensed under <a href="https://creativecommons.org/licenses/by-sa/3.0/" rel="nofollow license" target="_blank">cc by-sa 3.0</a> with attribution.
			</div>
			<div id="fcontact">
				admin@sprosi.pro
			</div>
		</div>
	</footer>
	<link rel="stylesheet" href="/public/site/styless.css">
	
	<script src="https://yastatic.net/es5-shims/0.0.2/es5-shims.min.js"></script>
	<script src="https://yastatic.net/share2/share.js"></script>
	
	<!-- Yandex.Metrika counter -->
	<script type="text/javascript" >
	    (function (d, w, c) {
	        (w[c] = w[c] || []).push(function() {
	            try {
	                w.yaCounter49943527 = new Ya.Metrika2({
	                    id:49943527,
	                    clickmap:true,
	                    trackLinks:true,
	                    accurateTrackBounce:true,
	                    webvisor:true
	                });
	            } catch(e) { }
	        });
	
	        var n = d.getElementsByTagName("script")[0],
	            s = d.createElement("script"),
	            f = function () { n.parentNode.insertBefore(s, n); };
	        s.type = "text/javascript";
	        s.async = true;
	        s.src = "https://mc.yandex.ru/metrika/tag.js";
	
	        if (w.opera == "[object Opera]") {
	            d.addEventListener("DOMContentLoaded", f, false);
	        } else { f(); }
	    })(document, window, "yandex_metrika_callbacks2");
	</script>
	<noscript><div><img src="https://mc.yandex.ru/watch/49943527" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
	<!-- /Yandex.Metrika counter -->
	
	<!-- Global site tag (gtag.js) - Google Analytics -->
	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-123764065-1"></script>
	<script>
	  window.dataLayer = window.dataLayer || [];
	  function gtag(){dataLayer.push(arguments);}
	  gtag(