问题:

        项目中使用了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}'

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐