我有两个使用相同文件名运行的 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 号是稍后运行的进程。但不总是