- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我创建了一个服务器程序,当它收到一些命令时,它会执行一些操作。我希望当它收到命令“android”(当客户端从 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());
}
我第一次断开 android 设备时,p.exitValue()
的输出是 143
,脚本一直在执行。之后,如果我再次连接 android 客户端,它似乎不会再次启动脚本(这是一件好事,我不知道为什么或者它确实启动了它,但因为资源已经在使用中,它很快就会关闭)并且当我断开这个新客户端时 p.exitValue()
返回 0
。这是正常的事情,因为该过程不存在。但在此期间,第一个脚本启动的过程一直在运行。
我想知道为什么我的命令 p.destroy()
没有终止我的脚本进程。我认为这可能是因为它停止了 sh 进程而不是我的脚本的进程(两个不同的进程)有点像这里 java Process stop entire process tree
希望有办法解决这个问题,谢谢! :)
最佳答案
您可以通过以下命令检查您的脚本是否在服务器中运行。
ps-efw | grep '进程名称'
现在要从 java 程序中停止您的脚本,您可以执行以下命令。
pkill -9 -f 'test-raspicamsrc.sh'
pkill 命令用于通过提供进程模式来终止进程。如果你想在没有 pid 的情况下终止你的 firefox 应用程序,你可以像下面这样执行。
pkill -9 -f '火狐'
关于Java如何停止程序中先前启动的shell脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23105861/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!