解决通过 crontab 调用 FTP 命令行客户端未正确退出导致大量 FTP 进程滞留内存的问题
前阵子写了个小脚本,用于异地备份与自动删除过期文件。使用一段时间后发现异常,表现为:
ps aux | grep ftp
通过这个命令显示有大量的 FTP 客户端进程滞留内存。一开始以为传输未结束导致,经过文件比对后发现传输确实已结束。辣么为何 FTP 进程未能自动退出呢?
网上查询后有人说使用 passive 命令,但我的脚本中已经对 FTP 命令设置了 -inp 的参数,其中参数 p 即启用被动模式传输。若再使用 passive 命令,会使 FTP 从被动模式切换回默认的主动模式,导致连接与传输失败。
权宜之计是在 crontab 中,在定时备份的任务后若干小时再执行这个任务:
for i in `ps aux | grep "ftp -inp" | grep -v grep | awk '{ print $2 }'`; do kill -9 $i; done
确实挺 low 的,Google 了半天貌似没发现还有其他不幸遭遇的同志。若有更好的解决方案,跪求留言。
不如换lftp试试。
感谢建议。之前看过,不确定lftp对需要NAT的VPS是否友好,主要还是被动模式的坑。我抽空测试一下。再次感谢建议。
为什typecho的社区显示52 Bad Gateway???社区无法登录 了???
咋到这儿留言了,这要问下 70。我这边是可以打开,但速度比较慢。已给 70 留言。
我们今天也遇到了。crontab设定时任务到其他服务器。然后没有退出一直占着,今天爆发了那台ftp服务器所有连接都被我们占满了..请问您知道原因么
以我扯蛋的经验来看,有可能是传输文件较大或者网络通讯不好,导致传输时间较长,然后即便最终传输完成了, ftp 进程也不能自动退出。一段时间下来后就会堆积大量的 ftp 进程。好在除了自己恶心和稍微占用一些内存之外也无其他问题。这篇文章的脚本也是权宜之计,还是评论区那位兄台说得对,用 lftp 吧,谁用谁知道。