唯一标识同名的java进程

唯一标识同名的java进程

我有两个使用相同文件名运行的 java 进程MyApp.jar(例如)。

/usr/java/latest/bin/java -jar MyApp.jar

这些 jar 存在于不同的地方并使用不同的配置。

我希望能够杀死一个进程,但不知道如何区分这两个进程。我执行:

 ps aux | grep [M]yApp.jar

并得到:

admin    21509  0.8  0.1 1199908 20484 ?       Sl   08:21   0:00 /usr/java/latest/bin/java -jar MyApp.jar
admin    21585  6.7  0.1 1199764 20084 ?       Sl   08:21   0:00 

我考虑过使用一些虚拟参数创建流程以便能够区分它们:

/usr/java/latest/bin/java -jar MyApp.jar MyAppTheFirst

/usr/java/latest/bin/java -jar MyApp.jar MyAppTheSecond

但这对我来说似乎有点不对。有没有更好的办法?

答案1

第一的,你为什么要杀掉他们中的任何一个?如果某个进程使用了​​太多资源,您可以在以下位置获取 PID top

top -n 1

如果需要定期重新启动或对外部刺激做出反应,请使用流程管理:

while true
do
    java -jar MyApp.jar &
    my_app_pid=$!
    while ! whatever_makes_me_think_my_app_should_be_restarted
    do
        sleep 60
    done
    kill $my_app_pid
done

答案2

更改参数会对应用程序产生影响,因此这不是最好的主意。您可以更改 $0 即程序名称本身。大多数程序并不关心这一点,但有些程序会据此改变它们的行为(例如,如果您可以使用不同的名称调用相同的二进制文件,例如使用 mtools 和 busybox 的 IIRC):

bash -c 'exec -a mysleep sleep 100'
ps aux | grep sleep
hl       20818  0.0  0.0   5732   576 pts/10   S+   10:01   0:00 mysleep 100

或者你使用的环境:

bash -c 'IDSTRING=PROC1 exec sleep 100'
PID=20936
tr '\0' '\n' </proc/"$PID"/environ | grep IDSTRING
IDSTRING=PROC1

或者使用包装脚本启动进程,该脚本将 PID 和附加信息(用于区分进程)写入日志文件。

答案3

唯一有帮助的方法是确定较大的 PID 号。较大的 PID 号是稍后运行的进程。但不总是

相关内容