При работе с Git и сервером через SSH частая трабла: ssh-agent (или другие процессы) остаются висеть в процессах, даже после выхода из консоли через exit. Это приводит к тому, что накапливаются десятки процессов ssh-agent.. ну а на хостингах обычно ограничения под количество этих самых процессов. Да и вообще — они жрут ресурсы по чем зря, а мы ведь за всё хорошее, против всего плохого.
В общем краткий рецепт, как автоматически завершать ssh-agent при выходе, чтобы избежать ошибок типа:
error: cannot create thread: Resource temporarily unavailable
fatal: send-pack: unable to fork off sideband demultiplexer
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
Итак… Обычно ssh-agent запускается командой:
eval `ssh-agent -s` ssh-add ./.ssh/
Правильно, конечно, закрыть его вручную (ssh-agent -k), но это дико лень и вообще не вспомнишь.
Решение:
Я подключаюсь таким уанлайнером:
cd <имя_домена>.ru/public_html && eval `ssh-agent -s` && ssh-add ./.ssh/id_rsa && trap "ssh-agent -k" EXIT
Чито делает эта командо?
- Переходит в папку с сайтом (
cd <имядомена>.ru/public_html). - Запускает ssh-agent (
eval `ssh-agent -s`). - Добавляет SSH-ключ (
ssh-add ./.ssh/). - Настраивает
trap, который автоматически завершает ssh-agent при выходе. - Если ты вводишь
exit, ssh-agent закроется сам как миленький!
В принципе, для надежности можно юзать:
cd <имя_домена>.ru/public_html && eval `ssh-agent -s` && ssh-add ./.ssh/id_rsa && trap "ssh-agent -k" HUP
EXIT — завершает ssh-agent при нормальном выходе из шелла через exit, тогда как HUP — завершает ssh-agent даже при разрыве соединения. Т.е. когда забыл exit и тупо закрыл окно крестом — все само разрулится.
Как проверить, что ssh-agent не остается в процессах?
ps aux | grep ssh-agent
Если в выводе нет ssh-agent — жизнь удалась.
Если нет — принудительно завершить все свинячие висячие ssh-agent разом:
pkill -9 ssh-agent
(учтите, что pkill -9 убьет все процессы ssh-agent без разбору. Если на сервере несколько пользователей, pkill может завершить чужие ssh-agent. Чтобы убить только свои: pkill -u $USER ssh-agent)
Удачки.
