我有一个部署用户每分钟都在运行一次 cronjob 调整。
在远程服务器(部署目标)上,我没有可用的公钥,而是通过Could not open a connection to your authentication agent
ssh-add 在我的部署服务器上获得了一个。
我最终将这一行放到了我的 .bashrc 中:
ps -u $(whoami) | grep ssh-agent &> /dev/null || (eval $(ssh-agent) && ssh-add)
Run Code Online (Sandbox Code Playgroud)
尽管在我的理解中不应该,但 cronjob 每次都会打开一个新的 ssh-agent。14-16 小时后,服务器在创建包含大量如下条目的 kern 日志后内存不足:
Aug 12 21:50:58 tools kernel: [64021.568750] [25668] 1000 25668 2654 81 9 0 0 ssh-agent
Run Code Online (Sandbox Code Playgroud)
...我必须重新启动它。
如何在结束 cronjob 后将正在运行的 ssh-agent 进程的数量限制为 1 或终止该进程?
更新
给定的答案工作得很好,我刚刚发现我eval ssh-add
在 crontab 中有另一个。我将用赏金来奖励给定的问题。
要终止 ssh-agent 进程,您只需使用该ssh-agent -k
命令即可。
但是,您可能会收到以下错误消息:
SSH_AGENT_PID 未设置,无法杀死代理
它与括号内的命令调用的子shell相关。父 shell 看不到在子 shell 中生成的变量,使 SSH_AGENT_PID 为空。
您可以将单行更改为:
ps -u $(whoami) | grep ssh-agent &> /dev/null
if [ $? -ne 0 ];then
eval $(ssh-agent)
ssh-add
fi
trap 'ssh-agent -k; exit' 0
Run Code Online (Sandbox Code Playgroud)
当您注销系统时,最后一行将为您杀死代理。
但是请注意,这只适用于一个会话,假设您使用第二个会话登录,那么您在第一个会话中授权的 ssh-agent 将不会祝福第二个会话。您需要通过在第二个会话中导出 SSH_AGENT_PID 和 SSH_AUTH_SOCK 来解决它以使其工作。您可以通过将这两个变量打印到一个临时文件中来实现,并将其加载到 .bashrc 中,一个简单的例子:
ps -u $(whoami) | grep ssh-agent &> /dev/null
if [ $? -ne 0 ];then
eval $(ssh-agent)
ssh-add
echo "export SSH_AGENT_PID=$SSH_AGENT_PID" > ~/.agent-profile
echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> ~/.agent-profile
else
source ~/.agent-profile
fi
trap 'ssh-agent -k; exit' 0
Run Code Online (Sandbox Code Playgroud)
玩得开心。
编辑:
在 .bashrc 中尝试此操作之前,不要忘记杀死所有 ssh-agent,否则它将无法调用 ssh-agent,因为已经有一个正在运行的 ssh-agent。
归档时间: |
|
查看次数: |
8001 次 |
最近记录: |