При работе с 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
)
Удачки.