我已经在办公室安装了archlinux进行开发。我们使用maven将我们的应用程序部署到tomcat。我已经安装了tomcat7.0.47。我已经设置好一切(我认为),我可以使用tomcat:redeploy将webapp部署到tomcat。 我可以使用systemctl启动,停止并重新启动tomcat。问题是tomcat无法创建(甚至找到)其日志目录或创建其他目录。 我知道这是一个文件权限问题,我已经完成了:
chown -R tomcat7:tomcat7
和
chmod -R 775
on / usr / share / tomcat7以及此目录中链接的所有目录,如/ etc / tomcat7 /等。
但是,当我重新部署到tomcat时,我看不到应用程序在firefox中启动(我得到404)而catalina.out给了我
java.io.FileNotFoundException: logs/raven/org.ird.raven.2013-12-07.log (No such file or directory)
和systemctl status tomcat7给了我:
tomcat7.service - Tomcat 7 servlet container
Loaded: loaded (/usr/lib/systemd/system/tomcat7.service; enabled)
Active: active (running) since Sat 2013-12-07 08:40:30 AFT; 15min ago
Process: 4453 ExecStart=/usr/bin/jsvc -Dcatalina.home=${CATALINA_HOME} -Dcatalina.base=${CATALINA_BASE} -Djava.io.tmpdir=/var/tmp/tomcat7/temp -cp /usr/share/java/commons-daemon.jar:/usr/share/java/eclipse-ecj.jar:${CATALINA_HOME}/bin/bootstrap.jar:${CATALINA_HOME}/bin/tomcat-juli.jar -user tomcat7 -java-home ${TOMCAT_JAVA_HOME} -pidfile /var/run/tomcat7.pid -errfile /var/log/tomcat7/catalina.err -outfile /var/log/tomcat7/catalina.out $CATALINA_OPTS org.apache.catalina.startup.Bootstrap (code=exited, status=0/SUCCESS)
Main PID: 4457 (jsvc)
CGroup: /system.slice/tomcat7.service
├─4456 jsvc.exec -Dcatalina.home=/usr/share/tomcat7 -Dcatalina.base=/usr/share/tomcat7 -Djava.io.tmpdir=/var/tmp/tomcat7/temp -cp /usr/share/java/commons-daemon.ja...
└─4457 jsvc.exec -Dcatalina.home=/usr/share/tomcat7 -Dcatalina.base=/usr/share/tomcat7 -Djava.io.tmpdir=/var/tmp/tomcat7/temp -cp /usr/share/java/commons-daemon.ja...
Dec 07 08:40:30 archbase systemd[1]: tomcat7.service: Supervising process 4457 which is not our child. We'll most likely not notice when it exits.
Dec 07 08:40:30 archbase systemd[1]: Started Tomcat 7 servlet container.
在我更改文件权限后,我得到了类似的内容:
systemctl status tomcat7
PID file /var/run/tomcat7.pid not readable (yet?) after start.
我需要做些什么来完成这项工作。我真的很喜欢Arch。它快速而简单(在您设置之后)。有人可以帮帮我吗?
顺便说一句,我是第一次使用Windows 7,然后我去了OpenSuse,现在我想建立一个Arch。
答案 0 :(得分:2)
是的,chmod
对包所拥有的文件是不好的做法,因为这些权利是由包装商故意设置的。 pid not readable (yet?) after start
很可能是由于chmod
。我建议您使用pacman -Rs tomcat7
,从/var/lib/tomcat7/webapps
移除或备份已爆炸的战争,并最终使用pacman -S tomcat7
重新安装Tomcat 7,然后重新安装。
至于您的原始问题,Tomcat 可以查找并编写其目录/日志,但似乎您的 webapp 或其依赖API之一不能。您应该看一下这个logs/raven/org.ird.raven.2013-12-07.log
被设置为创建的位置,并且可能创建它应该在的目录层次结构。
您可以通过发出su tomcat7 -c "ls $DIR"
或su tomcat7 -c "mkdir $DIR
来仔细检查Tomcat是否具有对目录的预期权限。
答案 1 :(得分:0)
使用Arch Linux一年后,我现在对它的了解比我第一次提出这个问题时所知道的要多得多。 @guroux的答案仍然有效且正确,但我想确保阅读此问题的任何人都有一个直接的答案,并花更少的时间来解决这个问题。 如果部署到tomcat的webapp无法将日志写入系统,则将webapp中的日志目标更改为tomcat可以写入的系统上的位置。还要确保已指定绝对位置。在arch linux(以及我遇到的其他Linux发行版)上有两个地方,tomcat有权写入:
您也可以将其用于其他目的。例如,我的webapp将用户照片保存在系统上。在生产服务器上,其位置类似于/vault/raven
,但在我的工作机器上,我已将其设置为/tmp/vault
。这具有可在任何地方部署的优点。我的意思是我可以立即开始在任何其他机器上工作,而不必担心为我的webapp创建目录。
如果你不想这样做,你可以像我第一次解决这个问题时那样做。这可能有缺点,但它是一个快速的解决方案。
只需转到运行tomcat的服务文件即可。在archlinux中,它位于/usr/lib/systemd/system/tomcat7.service
中,并将-user tomcat7
替换为-user root
。执行systemctl daemon-reload
和systemctl restart tomcat7
后,您的tomcat应该自己创建目录。然后将用户更改回tomcat7并使tomcat7成为这些目录的所有者并重新启动tomcat。