在开发CrashReporter项目时遇到的一些坑

Tomcat启动时卡在”Tomcat: error deploying web application directory”

原因是Tomcat7/8需要使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom来产生安全随机类SecureRandom的实例作为会话ID。而我们知道,任何随机数发生器都需要一个种子,Linux中的随机数,可以从这两个特殊的文件中产生

  • /dev/urandom
  • /dev/random

这两个文件产生随机数的原理,是利用系统的熵池,计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。

熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了。

/dev/random在不能产生新的随机数时会阻塞程序,而/dev/urandom不会,当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择。/dev/random会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回,所以使用/dev/random比使用/dev/urandom产生大量随机数的速度要慢。

解决办法:

  1. 在Tomcat环境解决:启动时加入参数-Djava.security.egd=file:/dev/urandom
  2. 在JVM环境解决:修改$JAVA_PATH/jre/lib/security/java.security中的securerandom.source=file:/dev/randomsecurerandom.source=file:/dev/urandom

crontab 配置

crontab -e 编辑当前用户的定时命令
crontab -l 查看当前用户的定时命令

一条典型的定时任务

1
0 4 * * * /usr/bin/java -Xms256m -Xmx1024m -Duser.timezone=GMT+08  -jar /root/projects/crash-reporter/crash-reporter-0.1-SNAPSHOT-jar-with-dependencies.jar

在配置这个任务时,由于没有理解它本质上的原理,自己犯了一个愚蠢的错误,把时间写成了* 4 * * *,导致凌晨4点内,每分钟发出一篇邮件,还是发给全组人的……

附图一张,crontab的命令配置


Tomcat容器时间

在Linux系统里通过date命令查看,时区已经更改为北京时间。但是实际运行时,发现代码里通过new Date()创建的时间,format后打印出来居然是标准时间;同时,log4j记录的时间也有一样的问题。

原因在于,JVM的时间需要在启动时配置,需要在tomcat的启动命令中增加如下参数

1
-Duser.timezone=GMT+08

参考资料


===Ending===