linux的timeout处理wkhtmltopdf进程超时

10月 25th, 2014 5,290 留下评论 阅读评论

rails程序中要调用一个系统命令,但是这个系统命令在某些时候可能会处理很久也得不到结果,就需要控制超时情况。

一开始用ruby的Timeout.timeout方法,首先这方法不是很好用,然后这个方法会开启一个新的线程处理block中的代码,然后当发生超时情况时,即抛出了Timeout::Error异常,是可以处理超时情况,但是那个被开启的线程无法管理,甚至会影响到rails的终端(不能正常Ctrl-C结束了),并且调用系统命令所开启的新进程并不会被中止仍然是继续在后台执行。

听了quark大牛的方法,尽量不要使用ruby的timeout方法,使用靠谱又简单的linux timeout命令。

timeout -k 1 10s cmd 即可

不指定-s,就默认超时后向进程发送TERM信号,即普通的kill

-k 1是指,当10s之后向超时进程发出TERM信号后,在又1秒之后向超时进程发出KILL信号

在ruby中,用ret = `timeout`就可以直接调用系统命令,然后根据ret返回值进行判断是否超时。

————————————–wkhtmltopdf的分割线——————————————–

PS:要用timeout处理的命令是wkhtmltopdf,将HTML页面转化为PDF的开源神器,但是在国内的环境中遇到HTML页面中有被墙了的页面的话,就是执行很久的时间(和浏览器一样),为了防止服务器处于假死状态,需要控制这个执行的时间。

然后顺便说下使用wkhtmltopdf过程中遇到的坑

  • 转化HTML中的图片,如果不成功的话,试着尝试使用xvfb-run --server-args="-screen 0, 1280x1024x24" wkhtmltopdf
  • 若转化过程中中文出了问题,检查linux中的微软雅黑(simsun.ttc)、宋体等字体文件是否存在/usr/share/fonts/truetype
  • 转化的HTML中必须要把那种全屏遮蔽的div、悬浮窗之类的删掉,大概因为PDF渲染颜色的原因,不仅转化需要超长时间而且打开PDF卡的要死
  1. 还没有评论呢。