Завершение процессов при выходе из SSH


При работе с 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

Чито делает эта командо?

  1. Переходит в папку с сайтом (cd <имядомена>.ru/public_html).
  2. Запускает ssh-agent (eval `ssh-agent -s`).
  3. Добавляет SSH-ключ (ssh-add ./.ssh/).
  4. Настраивает trap, который автоматически завершает ssh-agent при выходе.
  5. Если ты вводишь 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)

Удачки.


Запись опубликована в рубрике Git, Linux. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.