如何运行程序并在后台获取其PID


1

我有一个Minecraft服务器启动脚本,如下所示:

#!/bin/bash
cd "$(dirname "$0")"
exec java -Xmx4096M -Xms4096M -jar minecraft_server.jar

如何在能够输入Java进程的输入的同时获得java进程的PID?

如果我将exec行更改为

exec java -Xmx4096M -Xms4096M -jar minecraft_server.jar & echo $! > pid

它不会让我输入任何文本到Minecraft服务器java进程。


您是否尝试过后台处理,获取PID,然后将流程重新置于前台?
Darth Android

Answers:


5

当您使用exec启动java进程时,其PID将与shell脚本相同。所以你可以做到

echo $$ > pid
exec java ...

您是否仍需要与服务器进程通信?
sean_m

是的,我需要与服务器进程通信(我使用 screen -x mc-vanilla -X stuff "say doing something blah blahboaweohv $(printf '\r')" 把东西输入我的我的Minecraft服务器。
Ivan

最后,我一直想知道如何在前台运行并导出PID多年!
Mark K Cowan

0

exec 将替换当前进程,因此从bash运行替换bash,这就是你失去交互式shell的原因。在开始我的世界之后,做 ps aux | grep minecraft_server.jar 将返回流程信息。如果您需要它只返回进程ID以重定向到pid文件或在bash函数中使用,您可以这样做: ps aux | grep minecraft_server.jar | awk '{print $2}'


我不想这样做的原因是因为我有多个同时运行的Minecraft服务器。我想获得该过程的PID,以便我可以杀死该过程,而不是其他的Minecraft服务器。
Ivan

疑难杂症。我在工作中使用了很多Tomcat服务器并使用ps aux方法,但是使用grep来解析jar文件的完整路径以区分服务器实例。
sean_m
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.