什么决定了Tomcat Java进程的当前工作目录?

我的生产服务器使用System V风格的初始化脚本运行Linux。

通过以root用户身份运行service tomcat6 start Tomcat( service在cwd /下运行init脚本)。

然后Tomcat提供一个网页来写入new File(".").getAbsolutePath() ,它显示/usr/share/tomcat6/.

但Tomcat初始化脚本( /etc/init.d/tomcat6 )没有提及CWD,也没有任何cd命令。

鉴于Java本身不能改变当前的工作目录,那么/usr/share/tomcat6成为Tomcat的当前工作目录呢? 在启动过程中哪里改变了cwd?

有问题的Linux是CentOS6。

在CentOS 6上,Tomcat init.d脚本通过这一行启动tomcat:

 $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start-security" 

$ SU是/ bin / runuser或/ bin / su,$ TOMCAT_USER通常是“tomcat”,而$ TOMCAT_SCRIPT通常是“/ usr / sbin / tomcat6”。 “su – ”或“runuser – ”以指定用户的身份从指定用户的主目录运行其命令。 所以这个命令会变成“tomcat”用户的标识和主目录,然后运行/ usr / sbin / tomcat6。 tomcat6脚本最终启动了tomcat本身。

tomcat用户的主目录应该和CATALINA_BASE相同。 简而言之,这里的“su”或“runuser”命令是将当前工作目录设置为CATALINA_BASE。

init.d脚本不是tomcat的正式组成部分, 它由包维护人员提供,并且可能因系统而异。 在我的Ubuntu 13系统上,/ /etc/init.d/tomcat6包含一个命令cd到$ CATALINA_BASE。

Tomcat自己的启动脚本(bin / startup.sh等)不设置工作目录。 当我使用自己的启动脚本直接启动tomcat 6或tomcat 7时,它只是继承了我从中运行的工作目录。

请记住,在Linux上,通过检查/proc/<pid>/cwd可以看到任何进程的实际当前目录。

你看到变数吗?

  • CATALINA_HOME :这代表了Tomcat安装的根目录。 当我们说“这个信息可以在你的CATALINA_HOME/README.txt文件中找到”时,我们的意思是查看Tomcat安装根目录下的README.txt文件。

  • CATALINA_BASE可选)通过为每个实例定义$ CATALINA_BASE,可以为多个实例配置Tomcat。 如果没有配置多个实例,则CATALINA_BASECATALINA_HOME相同。

在文件apache-tomcat-7.0.42/bin/catalina.sh你会看到:

 # Only set CATALINA_HOME if not already set [ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd` # Copy CATALINA_BASE from CATALINA_HOME if not already set [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"