新贵脚本与命令行:为什么会有这种行为差异?

Bos*_*osh 2 scripting tomcat shell upstart

我正在尝试设置 Tomcat 以从新贵开始。我发现以下作品:

  description "Tomcat Server"

  start on runlevel [2345]
  stop on runlevel [!2345]
  respawn
  respawn limit 10 5

  setuid tomcat

  env JAVA_HOME=/usr/lib/jvm/default-java
  env CATALINA_HOME=/opt/apache-tomcat-7.0.34

  script
    chdir $CATALINA_HOME
    exec $CATALINA_HOME/bin/catalina.sh run
  end script
Run Code Online (Sandbox Code Playgroud)

但是如果我删除chdir,tomcat 会启动,但是FileNotFound当我.wars加载时有很多例外。(也就是说:.wars它们自己确实加载了但它们在加载时抛出异常。)

请注意,此行为我从命令行调用时所看到的不同catalina.sh。从命令行调用,我可以/opt/apache-tomcat-7.0.34/bin/catalina.sh run 从任何目录(没有 chdiring)运行,一切都很好。

那么为什么chdir在我的新贵脚本中是必要的呢? (新贵环境与我的命令行环境有何不同?)


我不使用 chdir 时看到的错误示例:

Feb 22, 2013 3:00:11 AM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive my-war.war
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: my-war.log (Permission denied)
    at java.io.FileOutputStream.open(Native Method)
Run Code Online (Sandbox Code Playgroud)

ves*_*ako 5

这是一个写权限问题。不允许用户 tomcat 将日志文件创建到它试图创建它们的位置。它尝试创建日志文件的位置因您启动 tomcat 的方式而异。

你日志中的这篇文章引起了我的注意:

java.io.FileNotFoundException: my-war.log (Permission denied) at java.io.FileOutputStream.open(Native Method)

它表示不允许用户 (tomcat) 创建文件 my-war.log。以下是不同的场景:

chdir 新贵

新贵先把 chdirs 改成 $CATALINA_HOME。允许用户 tomcat 在那里创建文件。所以一切正常。

没有 chdir 的新贵

Upstart 以 root 身份运行,因此默认目录为 /。不允许用户 tomcat 在那里创建文件。所以你会得到权限被拒绝的错误。

从您的主目录运行 tomcat

现在你从你的主目录中以自己的身份运行 tomcat。您对自己的目录有写权限。所以一切都恢复了。