我创建了一个服务器程序,当收到某些命令,执行一些动作。 当它接收到命令“机器人”(当客户端从一个Android设备连接这恰好),我的服务器启动一个shell脚本,当客户端断开连接,我想它停止该脚本的执行,我想。
此外,当Web浏览器客户端连接,并发送命令“浏览器”服务器将推出的其他脚本。
这两个脚本无法在同一时间使用,因为它们使用相同的资源。 这就是为什么我必须阻止他们时,一个客户端断开连接(我知道,我不能有两种类型,同时连接的客户端)。
现在,我已经能够启动脚本,而不是阻止他们。 下面是在服务器运行我的方法的代码:
@Override
public void run() {
try {
BufferedReader ins = new BufferedReader(new InputStreamReader(soc.getInputStream()));
Runtime r = Runtime.getRuntime();
Process p = null;
int i = 0;
while (i < 1) {
String request = ins.readLine();
if (request == null || request.equals("close")) {
p.destroy();
System.out.println("The child was destroyed? "+p.exitValue());
i++;
}
else {
if (request.equals("android")) {
p = r.exec("sh /home/pi/test-raspicamsrc.sh &");
}
else if (request.equals("browser")) {
p = r.exec("sh /home/pi/test-http-launch.sh &");
}
else if (request.equals("left")) {
serialPort.writeBytes("4".getBytes());//Write data to port
}
else if (request.equals("right")) {
serialPort.writeBytes("6".getBytes());
}
else if (request.equals("stop")) {
serialPort.writeBytes("5".getBytes());
}
else if (request.equals("forward")) {
serialPort.writeBytes("8".getBytes());
}
else if (request.equals("backward")) {
serialPort.writeBytes("2".getBytes());
}
else {
System.out.println("Unknown command");
}
}
}
ins.close();
soc.close();
// We always stop the car in the end.
serialPort.writeBytes("5".getBytes());
}
第一次断开一个机器人设备,输出p.exitValue()
是143
,和脚本执行保持。 之后,如果我一个更多的时间与Android客户端连接它似乎并没有再次启动脚本(这是一件好事,我不知道为什么,也许它不会推出,但由于资源已在使用,它关闭速度非常快),当我拔下这个新的客户端p.exitValue()
返回0
。 这是因为该过程不存在正常的事情。 但在此期间推出了第一个剧本的过程中保持运行。
我想知道为什么我的命令p.destroy()
不杀我的脚本程序。 我想这可能是因为它停止SH过程,但不是我的剧本的过程中(两个不同的过程)喜欢这里有点Java进程停止整个进程树
我希望有解决这个问题,谢谢大家的方式! :)