【发布时间】:2017-11-19 01:01:19
【问题描述】:
在 Jenkins 中,我必须运行 2 个单独的脚本:start.sh 和 stop.sh。这些脚本在我的应用程序中,它是从 SCM 获取的。它们在同一个目录中。
start.sh 脚本使用 nohup 在后台运行一个进程,并将processId 写入save_pid.pid。这个脚本工作正常。它成功启动了我的应用程序。
然后在 stop.sh 中,我试图从save_pid.pid 读取processId 以删除该进程。但是,我无法删除进程并且应用程序继续运行,直到我使用手动终止进程:sudo kill {processId}。
这是我迄今为止在 stop.sh 中尝试过的方法,但这些方法都不起作用:
kill $(cat /path/to/save_pid.pid)
kill `cat /path/to/save_pid.pid`
kill -9 $(cat /path/to/save_pid.pid)
kill -9 `cat /path/to/save_pid.pid`
pkill -F /path/to/save_pid.pid
我也用sudo 尝试了所有这些步骤。但是,它只是行不通。我在 stop.sh 中保留了一个 echo 语句,它会打印出来然后什么都没有。
我在这里做错了什么?
更新:
我在 start.sh 中使用的nohup 命令是这样的:
nohup deploy_script > $WORKSPACE/app.log 2>&1 & echo $! > $WORKSPACE/save_pid.pid
请注意:
就我而言,
save_pid.pid中写入的值令人惊讶 总是比实际processId的值小 1。 !!!
【问题讨论】:
-
你确定
/path/to/save_pid.pid的内容真的是你要杀死的进程的PID吗? -
是的,我想是的。由于 stop.sh 不起作用,我手动读取了
save_pid.pid的内容,然后自己使用:sudo kill {processId}删除了该进程。之后应用程序停止。所以,我猜它是正确的 pid。 -
你检查脚本的错误输出了吗?如果
kill由于某种原因失败,它应该会产生一条错误消息,应该提供一些线索。 -
正如您在第一条评论中所建议的,我刚刚注意到一些奇怪的事情。当我检查时,
save_pid.id中的值:它总是比实际的processId小 1,我的意思是总是!!! .我发现实际上,在 start.sh 内部,nohup在端口 9005 中运行我的应用程序。当我列出所有打开的端口和相应的进程时,我看到了一个processId对应于9005,只比save_pid.id的内容多1个。这怎么可能 ?而且,我还检查了运行 stop.sh 的输出。令人惊讶的是,除了我保留在那里的echo声明之外什么都没有。 -
请注意,错误将被打印到
stderr,而不是stdout。如果您找不到打印stderr的位置,您可以暂时重定向它以进行调试,写为kill -9 ... 2>&1。至于为什么 PID 不同,似乎无论创建 PID 文件,它都没有正确执行。 (未写入正确的 PID 以终止进程以关闭进程。)