背景需求
我们经常可能需要从代码中启动一个脚本,或者一个程序来辅助自己完成需要的功能。比如bash脚本启动一个程序服务,可以通过进程之间的通信(比如socket)获取本程序想要的信息。
##进程的创建
Java提供了两种方法用来启动进程或其它程序:
(1)使用Runtime的exec()方法
(2)使用ProcessBuilder的start()方法
实际上Runtime.exec() 代码中最终也调用了ProcessBuilder的start()方法 。
这里主要展示一个简单的执行查看网卡信息的代码和从java代码中启动一个bash进程执行java命令的代码
|
|
|
|
杀死进程
代码中启动的新进程可能是一个服务或者类似ping baidu.com这种的不停执行的命令,不会因为当前进程的退出而退出。而且进程process对象中也无法获取到进程的id,给我们用于kill。
杀掉创建的进程
代码中通过启动一个新的进程找到和之前启动的进程相关的程序,比如之前启动的进程包含了执行infrastructure.TranswarpServer的java程序,那么可以通过ps aux | grep ‘infrastructure.TranswarpServer’找到相关的进程信息
我们简单测试就可知,从代码中执行ps aux | grep ‘infrastructure.TranswarpServer’指令,得到的不止我们需要的信息,还包括grep本身的进程,以及我们bash -c启动的进程信息,如下所示的这前两个就是无用的,最后一个才是我们真正需要的,而且这个bash执行完,前两个进程实际就消失了。
但是我们不用在意这些,将所有的pid都收集起来形成一个list,均kill -9 掉,如果已经不存在,kill -9 也不会有什么作用,对真正我们要kill的pid,也能正常kill。
123ganjun 11178 0.0 0.0 2432804 1324 ?? R 6:47PM 0:00.00 grep infrastructure.TranswarpServerganjun 11176 0.0 0.0 2435440 2124 ?? S 6:47PM 0:00.00 bash -c ps aux | grep 'infrastructure.TranswarpServer'ganjun 10014 0.0 0.2 8207960 29408 ?? S 6:15PM 0:02.33 /usr/bin/java -cp ... infrastructure.TranswarpServer
|
|