我正在创建一个自定义游戏服务器,并且有一个 .jar 文件来运行它。我需要在单个虚拟机(例如 15 个)上启动多个游戏服务器。我发现我可以像这样运行它们:
java -jar server-1.0.jar &
但当我打字时ps
,我只看到PID
, CMD
,TTY
和TIME
。我如何识别哪个是服务器 6、哪个是服务器 9 等等?我应该用什么?
答案1
pid
您可以在启动后台作业后立即记下它:
command & pid1=$!
command & pid2=$!
$!
是最后启动的后台作业的 pid。
使用通过脚本或程序中进程的属性搜索 pid 的工具是不明智的。
进程应该始终跟踪其子进程。如果您沿着ps
/ ... 路线走下去pgrep
,您就有杀死(=发出信号)无辜受害者(=不属于您自己但意外匹配您的查询的进程)的风险。
如果您瞄准正确的 pid,但这些 pid 不是您的孩子,您也会面临这种风险。一个pid
槽会被保留,直到进程死亡并且其父进程wait
在其上(只有父进程可以wait
在进程上)。如果 a不是您的,则它可能已经死亡并在您获悉 a 的时间和您发出信号的时间pid
之间等待。pid
那么你可能会瞄准无辜的受害者(竞争条件)。
答案2
例如使用-f
开关来ps
显示更多信息。看man ps
:
-f
进行完整格式的列表。此选项可以与许多其他 UNIX 样式选项结合使用以添加其他列。这也导致了 要打印的命令参数。与 一起使用时-L
,将添加 NLWP(线程数)和 LWP(线程 ID)列。请参阅c
选项、格式关键字 args 和格式关键字 comm。