作为 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
不允许调用,因为用户没有所需的权限。有没有一种简单的方法可以从脚本中导出环境变量,以便它们在停止后脚本中可用,或者将它们写入文件并在停止后获取该文件是最好的方法?
答案1
我最终将ssh-agent
启动拆分为一个一次性任务,该任务在启动时启动并将路径导出到代理设置(现在存储在文件中),以便其他启动脚本可以依赖启动ssh-agent
脚本并获取文件来检索环境变量。