我如何启动/停止失败的 upstart 作业?

我如何启动/停止失败的 upstart 作业?

我在 中有一个 upstart 脚本/etc/init/myexample.conf。此作业基本上运行一个 java jar 文件。通常,我可以使用sudo start myexample和来启动和停止它sudo stop myexample

我更改了 jar 文件并引入了一个导致 jar 崩溃的错误。使用 启动 jar 后sudo start myexample,我在日志文件中看到了错误。

现在我想停止 upstart 作业并再次用可运行的 jar 文件替换该 jar 文件。我看到过两种情况:

  1. sudo stop myexample无限期挂起(至少 10 分钟)。我也无法使用 重新启动作业sudo start myexample,我收到错误start: Job is already running: myexample

  2. sudo start myexample无限期挂起,并sudo stop myexample给出stop: Job has already been stopped: myexample

我还可以从命令行手动运行 jar。

pgrep -lf myexample并且pgrep -l myexample不返回任何内容。pgrep -l java显示正在运行的其他 java 进程,但不显示与 myexample 对应的失败进程。Upstart 认为该进程正在运行,但实际上没有。

如何在不重启的情况下让 upstart 作业再次运行?


/etc/init/myexample.conf

description "myexample"  

start on runlevel [2345]  
stop on shutdown  

respawn
respawn limit 3 120

expect daemon

setuid exampleuser

script     
    chdir /home/exampleuser/ 
    java -jar /home/exampleuser/example.jar
end script

答案1

终止该进程。

您可以通过以下方式终止该进程(如果正在运行):

pkill <process_name>

或者

killall <process_name>

这将仅匹配进程名称,如果您想匹配整个命令行,请(小心)使用:

pkill -f <part_of_the_command>

因此就你的情况而言:

sudo pkill myexample

应该做。

您可以通过运行以下命令来预先确定:

pgrep -l myexample

检查进程 ID,以确保没有其他进程与该名称重合。

另外,使用 找到 PID 后pgrep -l myexample,您也可以使用以下命令终止该进程kill

kill PID

相关内容