前阵子写了个小脚本,用于异地备份与自动删除过期文件。使用一段时间后发现异常,表现为:

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 了半天貌似没发现还有其他不幸遭遇的同志。若有更好的解决方案,跪求留言。

标签: ftp, crontab, linux

已有 6 条评论

  1. druggo druggo

    不如换lftp试试。

    1. 感谢建议。之前看过,不确定lftp对需要NAT的VPS是否友好,主要还是被动模式的坑。我抽空测试一下。再次感谢建议。

  2. 为什typecho的社区显示52 Bad Gateway???社区无法登录 了???

    1. 咋到这儿留言了,这要问下 70。我这边是可以打开,但速度比较慢。已给 70 留言。

  3. Xinyu Xinyu

    我们今天也遇到了。crontab设定时任务到其他服务器。然后没有退出一直占着,今天爆发了那台ftp服务器所有连接都被我们占满了..请问您知道原因么

    1. 以我扯蛋的经验来看,有可能是传输文件较大或者网络通讯不好,导致传输时间较长,然后即便最终传输完成了, ftp 进程也不能自动退出。一段时间下来后就会堆积大量的 ftp 进程。好在除了自己恶心和稍微占用一些内存之外也无其他问题。这篇文章的脚本也是权宜之计,还是评论区那位兄台说得对,用 lftp 吧,谁用谁知道。

添加新评论