Mate 2 outros processos com o script .sh

0

Eu tenho um arquivo radio.sh. Eu inicio a partir do Java com:

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);
      }

no 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

Eu gostaria de matar este processo porque quero mudar a frequência. Gostaria de executar um novo script radio1.sh com o mesmo script, mas com outra frequência.

Eu posso matar rtl_fm e aplay com killall rtl_fm e killall aplay , mas rtl_fm não é 100% morto. Mas não consigo ouvir nada. Se eu iniciar o java e iniciar este radio.sh , não consigo ouvir nada. Não está funcionando.

Se eu iniciar radio.sh em um terminal, ele me diz que não consigo abrir o dispositivo. Eu acho que o dispositivo está em uso.

Como posso matar esse processo com um script?

    
por DjEKI 14.10.2015 / 20:41

1 resposta

1

A melhor maneira de fazer isso é fazer com que o processo ( rtl_fm ) grave seu próprio PID em um arquivo PID e use o conteúdo desse arquivo para eliminar o processo.

No entanto, como rtl_fm não tem como gravar o PID em um arquivo, podemos usar uma solução alternativa.

#!/bin/bash
RTL_PID='ps -e | grep rtl_f[m] | awk '{print $1}''
kill ${RTL_PID}

Primeiro, definimos uma variável RTL_PID com o PID do processo. Obtemos isso listando todos os processos, procurando por rtl_fm . O [m] é um truque que impede que grep rtl_fm apareça na lista de processos. Finalmente, pegue a saída de linha e obtenha o primeiro campo dela, que é o PID.

Observe que isso enviará um sinal TERM ao processo. Se isso não funcionar e você precisar enviar um KILL , adicione um -9 , por exemplo, kill -9 ${RTL_PID} .

    
por Paul 15.10.2015 / 23:08