这篇文讲什么

讲我用定时任务 crontab 遇到程序不终止并且占满内存的问题。
这篇文只提出了问题,没有解决方法。等我解决了再补充,现在纯粹是分享一下。
如果你知道怎么解决可以在下面留言。

这篇文对谁有用?有什么用?

对谁有用?:程序员
有什么用?:┑( ̄Д  ̄)┍

正文

我在用 cronjob 定时执行抓取 Instagram 图片的程序:

0 * * * * /bin/bash -l -c 'cd /var/www/insta-craw && ./loop_user.rb >> /var/www/crawl_instagram_log/cron_standard.log 2>> /var/www/crawl_instagram_log/cron_err.log'

cron 是用 whenever gem 生成的语法,我没有手写这里的语法。
貌似写的是1个小时一次。这条命令的 0 * * * * 我也没看懂。

这个任务是跑一个 ruby 程序,
然后 ruby 程序会把 Rails 程序带起来做后续操作。

定时任务在一台 1G 内存 25G 硬盘的 Digital Ocean 机器上面跑(5美金一个月)
这台机器上有 1c7.me 和 yuzhu.me 外加这个定时任务,就这3个程序。

实际结果:
1c7.me 和 yuzhu.me 都无法访问了,提示 mysql 3306 的错误。
硬盘没满。

htop 命令发现内存和 swap 都完全满了。
杀掉定时任务的进程就好了。

问题

代码里也没有写任何死循环的东西。为什么进程一直不退出?
搞得我现在博客和 yuzhu.me 经常挂掉。要手动去服务器杀进程,非常麻烦。

后记 2020-5-24

有个朋友微信上找我单独问了这篇文章的后续,所以我今天补写一点内容

  • 就这个例子而言,因为任务要求是抓取指定的十几个博主的所有 instagram 图片
    不是整个 instagram,初次抓取的图片较多,后续定期更新时就不需要抓那么多图片了

  • 后续发展,我印象里是直接放笔记本上跑,跑完图片扔七牛,图片地址存入数据库,不再使用 cronjob 了,因为那台机器太弱了,没我笔记本强

  • 用 Ruby 脚本抓 instagram 的代码是从 Github 找的,印象里没有多线程,至于为什么卡,我也忘了

  • 如果今天还碰到这样的任务,而且非要求在服务器跑,那么可能我直接会用 Docker 来处理,比如 AWS ECS 可以定容器数量和内存大小,开多几个,卡就卡吧,也无所谓,只要不崩就行