9

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

Tomcat 是通过service tomcat6 start以 root 用户身份运行来启动的(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。

4

2 回答 2

8

在 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

于 2013-09-12T14:22:38.183 回答
0

你看到变量了吗?

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

  • CATALINA_BASE或者,可以通过为每个实例定义 $CATALINA_BASE 来为多个实例配置 Tomcat。如果未配置多个实例,CATALINA_BASE则与CATALINA_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"
于 2013-09-12T02:09:58.003 回答