我有一个 radio.sh 文件。我使用以下命令从 Java 启动它:
Process ls=null;
BufferedReader input=null;
String line=null;
try {
ls= Runtime.getRuntime().exec(new String[]{"/bin/bash", "/home/djeki22/Dokumente/radio.sh"});
input = new BufferedReader(new InputStreamReader(ls.getInputStream()));
} catch (IOException e1) {
e1.printStackTrace();
System.exit(1);
}
在radio.sh中:
#!/bin/bash
rtl_fm -f 103.78M:103.82M:25K -M wbfm -s 159K -r 48K -l 2 -E deemp -F 9 - | aplay -r 48k -f S16_LE
我想终止此进程,因为我想更改频率。我想radio1.sh
使用相同的脚本运行一个新脚本,但使用其他频率。
我可以用rtl_fm
和aplay
来杀死killall rtl_fm
和killall aplay
,但rtl_fm
并没有 100% 被杀死。但我听不到任何声音。如果我启动 java 并启动这个radio.sh
,我听不到任何声音。它不起作用。
如果我radio.sh
在终端启动,它会告诉我无法打开设备。我认为该设备正在使用中。
我如何使用脚本终止该进程?
答案1
最好的方法是让这个过程(rtl_fm) 将其自己的 PID 写入 PID 文件,然后使用该文件的内容来终止该进程。
然而,由于rtl_fm没有办法将其 PID 写入文件,我们可以使用解决方法。
#!/bin/bash
RTL_PID=`ps -e | grep rtl_f[m] | awk '{print $1}'`
kill ${RTL_PID}
首先,我们设置一个变量返回到PID进程 PID。我们通过列出所有进程来获取此信息,查找rtl_fm。这[m]
是一个避免grep rtl_fm
出现在进程列表中的技巧。最后,获取行输出并从中获取第一个字段,即 PID。
请注意,这将发送学期向进程发送信号。如果这不起作用,你需要发送一个杀,添加一个-9
,例如kill -9 ${RTL_PID}
。