作为 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
不允许调用,因为用户没有所需的权限。有没有一种简单的方法可以从脚本中导出环境变量,以便它们在停止后脚本中可用,或者将它们写入文件并在停止后获取该文件是最好的方法?