使用 .sh 脚本终止其他 2 个进程

使用 .sh 脚本终止其他 2 个进程

我有一个 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_fmaplay来杀死killall rtl_fmkillall 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}

相关内容