新手问题 Ruby 脚本总是使 CPU 占用率 100%

syhsyh9696 · 2017年06月27日 · 最后由 luikore 回复于 2017年06月29日 · 2272 次阅读

大家好,我有一个简单的 ruby 脚本提供一个简单的 telegram-bot 功能。

但是我发现这个 telegram-bot 的脚本总是在一定时间之后 CPU 占用率就会 飙升,我没有找出哪里可能溢出,恳请大家帮帮我。

bot 脚本在这里

ruby 版本呢?

100% 是把一个核心吃满还是把所有核心吃满了?如果是后者那肯定是 handle_thread 方法里线程相关的问题了。如果是前者我读了一圈觉得有几个可能出现死循环问题的地方,但这脚本不太方便部署调试。

lz token 都贴出来了.......

https://ruby-china.org/topics/25959 建议试试 ruby-prof,查看一下 CPU 消耗在哪些地方。

@kikyous 无论是 2.3 还是 2.4 都这样

@liprais 哈哈无所谓啦,不想再搞解析 yml 了

@sec 谢谢,我去看看。

@dsh0416 只是一个单核机器....

楼主的 MySQL database 名称震惊了

marksloan 回复

没错就是干这个的

老司机发车了。。。

syhsyh9696 回复

隐藏彩蛋。。这都可以

答应我,给个车牌好不好。

竟然在 ruby-china 上开车。。。

老司机也有翻车的一天,大家还得安全驾驶啊。。

client = Mysql2::Client.new(:host => "127.0.0.1", :username => "root", :password => "XuHefeng", :database => "javlibrary") 建 AV 图书馆

你看这段代码,如果 str 里带有单引号,简单就出一个错,如果 str"'; drop database ...;" 就注入攻击啦

client = Mysql2::Client.new(:host => "127.0.0.1",
                            :username => "root",
                            :password => "XuHefeng",
                            :database => "javlibrary")

result = client.query("SELECT * FROM video WHERE video.license='#{str}'")
if result.size == 0
    client.close
    return javlibrary_get(str)
end

出错后,client.close 就不执行了 (后面也同样), 随着时间的推移就会越来越多连接咯

luikore 回复

原来是这样,那我是不是应该 catch 一下异常保证错误不出现呢?

还是应该专门写一个 method 保证整个查询是安全的呢?

syhsyh9696 回复

你可以用 client.escape http://www.rubydoc.info/github/brianmario/mysql2/file/README.md#Usage

另外我不知道你的 telegram bot 会否调用 listen() 多次... 如果你也不知道就最好防御性的保证一下...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号