jsch链接sftp,连接未释放,进程一直存在
问题:项目中使用了sftp服务器存储文件和图片,突然有一天sftp的服务器报警,提示机器内存被打满了,赶紧上机器上看看,发现sshd的进程特别多,两万多个。。。都是sftp的连接,这才想到可能sftp建立连接后没有关闭释放;解决方案:添加logout方法,在sftp上传下载逻辑执行完之后,执行sftp的logout方法:/*** 关闭sftp连接*/public void logout(){if
问题:
项目中使用了sftp服务器存储文件和图片,突然有一天sftp的服务器报警,提示机器内存被打满了,赶紧上机器上看看,发现sshd的进程特别多,两万多个。。。都是sftp的连接,这才想到可能 sftp建立连接后没有关闭释放;
解决方案:
添加 logout 方法,在sftp上传下载逻辑执行完之后,执行 sftp 的 logout 方法,关闭sftp的连接:
/**
* 关闭sftp连接
*/
public void logout(){
if (sftp != null) {
if (sftp.isConnected()) {
log.info("关闭sftp");
sftp.disconnect();
}
}
}
发布到机器上执行sftp上传,发现连接还是没有释放,从官方的例子上 Sftp.java 中,可以看到,最需要关闭的是session对象而不是channel对象 ,所以应该在关闭sftp后关闭session
/**
* 关闭sftp连接
*/
public void logout(){
if (sftp != null) {
if (sftp.isConnected()) {
log.info("关闭sftp:{}",sftp);
sftp.disconnect();
}
}
try {
if (sftp.getSession() != null) {
if (sftp.getSession().isConnected()) {
log.info("关闭sftp.getSession()");
sftp.getSession().disconnect();
}
}
} catch (Exception e) {
log.error("关闭sftp.getSession()出现异常!", e);
}
}
再次测试,调用sftp上传,sftp的连接数没有增加,释放连接成功!
sshd进程的查看,数量统计,进程号输出,进程清理命令
1. 查看sshd进程
ps -ef | grep sshd
ps -ef:打开所有的进程, grep sshd 通过grep过滤包含”sshd“字符的进程;
2.查看sshd进程中的sftp进程,并排除当前查询的进程
ps -ef | grep sshd | grep sftp | grep -v grep
grep -v grep:过滤掉含有“grep”字符的进程,因为当前过滤sftp的进程grep sftp也会被算做一个。
3.统计sshd进程中sftp进程的数量
ps -ef | grep sshd | grep sftp | grep -v grep | wc -l
wc -l:统计sftp进程的行数,即为想要的总数,-l或--lines 只显示行数。
4.查看所有sshd进程中sftp进程的进程号
ps -ef | grep sshd | grep sftp | grep -v grep | awk '{print $2}'
awk '{print $2}' fileName: 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段,这里没有文件,读取的是控制台输出,以空格座位分隔符;
5.杀掉所有sshd进程中sftp进程的进程
kill -9 `ps -ef | grep sshd | grep sftp | grep -v grep | awk '{print $2}'
更多推荐



所有评论(0)