В рамках сценария Upstart мне нужно запустить ssh-agent для загрузки ключа развертывания GitHub, поэтому в сценарии у меня есть:
eval "$(ssh-agent -s)"
ssh-add $HOME/.ssh/id_rsa
Проблема в том, что при перезапуске службы ssh-agent перезапускается, в результате чего у меня остается несколько запущенных копий. Я почти уверен, что это потому, что переменные среды теряются при повторном запуске скрипта. Я пробовал следующее:
script
...
# Ensure SSH agent is running
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)" >/dev/null
ssh-add $HOME/.ssh/id_rsa
initctl set-env --global SSH_AUTH_SOCK=$SSH_AUTH_SOCK
initctl set-env --global SSH_AGENT_PID=$SSH_AGENT_PID
initctl set-env --global SSH_AGENT_LAUNCHER=upstart
fi
exec ...
...
end script
post-stop script
# Shut down SSH agent
if [ "$SSH_AGENT_LAUNCHER" = upstart ]; then
kill $SSH_AGENT_PID 2>/dev/null || true
initctl unset-env --global SSH_AUTH_SOCK
initctl unset-env --global SSH_AGENT_PID
initctl unset-env --global SSH_AGENT_LAUNCHER
fi
end script
Проблема в том, что у меня setuid
в сценарии, поэтому initctl
вызов не разрешен, так как у пользователя нет необходимых прав. Есть ли простой способ экспортировать переменные среды из сценария, чтобы они были доступны в сценарии после остановки, или записать их в файл и получить этот файл после остановки - лучший способ сделать это?
Я закончил тем, что разделил ssh-agent
запускается в одноразовую задачу, которая запускается при запуске и экспортирует путь к настройкам агента (теперь сохраненным в файле), так что другие сценарии запуска могут просто зависеть от ssh-agent
сценарий запуска и источник файла для получения переменных среды.