Tomcat Java进程的当前工作目录由什么确定?

9

我的生产服务器运行的是Linux,使用System V风格的init脚本。

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

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

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

鉴于Java本身无法更改当前工作目录,那么为什么/usr/share/tomcat6成为了Tomcat的当前工作目录?它的启动过程中哪里更改了其cwd?

所涉及的Linux版本是CentOS6。

2个回答

9
在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”用户的ID和主目录,然后运行/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来查看任何进程的实际当前目录。


太棒了。我刚刚注意到/etc/passwd将tomcat用户的主目录定义为/usr/share/tomcat6 - user972946

0

你看到变量了吗?

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

  • CATALINA_BASE:可选地,Tomcat可以通过为每个实例定义$CATALINA_BASE来配置多个实例。如果没有配置多个实例,则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"

我确实见过那些环境变量,但没有看到过 cd $CATALINA_HOME - user972946

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接