Ubuntu Upstart 脚本在启动和停止时挂起

Ubuntu Upstart 脚本在启动和停止时挂起

我有一个 upstart 脚本,它将启动自定义 jetty 服务器。当我执行此操作时,sudo start [myservice]什么也没有发生。随后,sudo status [myservice]将其显示为:[myservice] start/killed, process 3586

这是 /etc/init/[myservice].conf 中的脚本:

description "[description]"
author "[my name and email]"
start on runlevel [2345]
stop on runlevel [016]
respawn
expect fork
script
    sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1
end-script

下面是grafserv-start.sh

#!/bin/bash
/usr/bin/java -Djetty.port=3070 -jar /path/to/grafserv/trunk/start.jar
echo "Done starting GrafServ"

我尝试将脚本命令的输出重定向到 tmp 日志文件,但该文件从未创建。当我启动它时,我只是挂起,直到我 ^C。此外,我尝试使用 strace 运行它,但这给了我很多关于套接字的信息。

答案1

sudo -u www-data

...如果提示输入密码,则会挂起。您是否检查过运行“启动脚本”的用户是否具有 sudoers 权限来执行此操作?

答案2

我认为可能存在三个问题:

  • expect fork错了,因为你的程序实际上并没有分叉。由于你使用的是脚本,所以情况可能并非如此,但你可能想尝试一下,expect daemon或者根本不期待。

  • 您的 java 程序实际上不会进入守护进程模式,因此需要将其置于后台。换句话说,您需要&在末尾添加:sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1&

  • 您的 Upstart 处于不良状态。我不知道具体是怎么回事,但您可能会遇到这样一种情况:即使您编辑脚本使其正确,它仍然会挂起。如果发生这种情况,请重命名文件(即/etc/init/[myservice]-1.conf尝试启动它直到停止挂起。一旦您正确设置了脚本,请将文件重命名为正确的名称并重新启动系统。

答案3

我认为您在 upstart 中遗漏了脚本前面的 exec...我认为这是必要的。试试这个:

exec sudo -u www-data /path/to/grafserv-start.sh >> /tmp/upstart.log 2>&1

就像 Bittrance 所说的那样,您可能还想确保您的 Java 程序在后台运行。&如果您的 Java 程序中没有任何将其作为后台进程或守护进程运行的逻辑,请尝试在脚本中的命令末尾附加一个或其他内容。

相关内容