暴发户脚本与命令行:为什么这种行为差异?

我试图设置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 

但是,如果我删除了chdir ,tomcat就会启动,但是当我的.wars加载时有大量的FileNotFoundexception。 (即: .wars本身会加载,但是会在加载时抛出exception。)

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

那么为什么我的新贵脚本中需要chdir (新兴的环境与我的命令行环境有什么不同?)


当我不chdir时,我看到的错误的例子w /暴发户:

 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) 

这是一个写入权限问题。 用户tomcat不允许创build一个日志文件到它试图创build它们的位置。 它尝试创build日志文件的位置取决于你如何启动tomcat。

从你的日志这件作品引起了我的注意:

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

它说用户(tomcat)不允许创build文件my-war.log。 以下是不同的情况:

暴发户与chdir

新贵首先到$ CATALINA_HOME。 用户tomcat被允许在那里创build文件。 所以一切正常。

没有chdir的暴发户

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

从你家的目录运行tomcat

现在你从你的家庭目录运行tomcat。 你有写权限给你自己的目录。 所以一切都再次运作。

我没有获得setuid支持的新贵版本,但这是我会做你的情况。

它看起来像一个环境差异问题。 最有可能的一个环境variables,从新贵运行时没有设置。 难道是setuid没有设置$USER$HOME

因此,我会build议您比较环境。 一个简单而简单的方法就是像这样修改你的初始化脚本并重新开始工作。

  script env > /tmp/env-upstart.log chdir $CATALINA_HOME exec $CATALINA_HOME/bin/catalina.sh run end script 

然后运行env > /tmp/env-console.log当你通常从控制台启动它(如果你使用的是sudo ,那么使用sudo env )。

然后比较两个/tmp/env-upstart.log/tmp/env-console.log文件(对它们进行sorting并用vimdiff打开它们),并且应该很容易findenv-upstart哪个variables从另一个文件中丢失(或被设置为你不会期望的东西)。

更新1

如果你仍然有错误,我会检查以下内容:

  • 用户权限 :有效/真实用户ID可能不同。 比较两种情况下的idid -r -uid -r -gid -r -Gid -uid -gid -G
  • stream程限制 :这可能是你的新贵脚本有更严格的限制。 尝试把一个ulimit -a比较。
  • Shell怪异 :不太可能,但新贵使用sh而你的用户的shell最有可能是bashzsh 。 尝试从sh运行成功的命令。
  • debugging脚本 :如果仍然真的卡住了,请在debugging模式下运行catalina.sh 。 就像这样从新贵跑起来一样简单:

     exec /bin/sh -x $CATALINA_HOME/bin/catalina.sh run 2>/tmp/catalina-upstart.log 

    然后你可以比较两个debugging日志,也许可以发现两个脚本做了什么不同的地方。

是的,这是关于许可的。 但与Upstart无关。 这是因为在“catalina.sh start”中,即在“开始”部分,真正的命令是:

  ... -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ org.apache.catalina.startup.Bootstrap "$@" start \ >> "$CATALINA_OUT" 2>&1 "&" 

这里的输出日志是完全分配的。 RUN部分没有“$ CATALINA_OUT”。 这将导致上述的写入许可问题。 也就是说,如果没有指定特定的输出文件path,则输出将会转到日志文件或以your.war编码的方式执行。 这些不明确的日志分配将导致不确定的权限问题。

要在命令行上运行服务器之间的所有环境元素的完整转储,而不是在Upstart下运行它,请尝试安装我的procenv工具,在两种环境中运行它,并区分输出文件:

这是在ubuntu raring和debian sid档案(和FreeBSD)中可用的。