我有这个简单的脚本,我在其中执行一个.jar文件,我需要它的PID来在sleep
命令之后杀死它:
java -jar test.jar &> output.txt & pid=$! sleep 10
问题是:PID在应用程序完全启动后发生变化,我首先得到的这个PID与应用程序在10秒睡眠后的PID不同(我使用ps
检查了它)。
我如何跟踪PID以便我可以终止完全启动的应用程序?
我试过使用pstree -p $pid
,但我得到了一长串Java子进程,我认为可能有更好的方法来实现这个,而不是得到每个子进程,使用grep提取PID并杀死它,也因为我不是100%确定这是工作。
我找到了使用jps
的另一个解决方案,但我更喜欢使用本地linux命令来兼容。
我不一定需要PID,使用进程名可能是一种方法,但我不知道如何检索,要么只有父进程的PID。
如果您想使用进程名,可以运行:
$ kill -9 $(ps aux | grep '[t]est.jar' | awk '{print $2}')
选项细节:
kill
:发送kill信号(SIGTERM 15: Termination)
,优雅地终止任何进程。kill -9
:发送kill信号(SIGTERM 9:Kill)
立即终止任何进程ps
:列出所有进程。grep
:过滤,[p]
防止实际grep进程显示在ps结果中。awk
:给出每行的第二个字段,即PID。(ps输出:$1:user, $2:pid…)
两种方式
- 使用系统。退出()内置函数。
或
- 将pid号重定向到一个文件,稍后使用该文件终止进程。
交货:-
java -jar test.jar &> output.txt & echo $! > pid-logs
cat pid-logs | xargs kill -9