Parando um processo de script com um Control + C ou algo assim

0

Estou tentando fazer um erro de antivírus para uma classe.

Estou usando o sox para gravar som. Que está funcionando bem.

o problema é que o sox precisa ser parado por um controle + C para parar e criar o novo arquivo. Se killall for enviado de uma sessão ssh diferente, ele descartará a outra sessão e o sox não criará o arquivo.

listen.sh

#! /bin/bash
NOW=$( date '+%F_%H:%M:%S' )

filename="/home/pi/gets/$NOW.wav"

sox -t alsa plughw:1  $NOW.wav;

sleep 6;

echo $filename

Eu tentei criar um script separado para pará-lo; praticamente

killlisten.sh

#! /bin/bash
sleep 5;
ps | grep sox | kill 0;

Em seguida, execute um

superscript.sh

#! /bin/bash
./listen.sh;
./killlisten.sh;

Qualquer conselho sobre como parar o sox de uma maneira que ainda produziria um arquivo de saída seria ótimo. Idealmente, isso será configurado para ser executado em horários definidos, evitando assim a interação humana.

    
por Reckless Liberty 06.03.2018 / 12:09

3 respostas

1

Seu pipeline

ps -aux | grep sox | kill 0

não fará o que você deseja fazer. Isso ocorre porque kill nunca lerá a entrada de grep (o resultado de grep também conterá muito de outras coisas além do PID do processo sox ) .

Se você tiver pkill , faça

pkill sox

em vez disso (use pkill -INT sox para enviar o mesmo sinal que Ctrl + C ).

Se você alterar seu script de inicialização para

#!/bin/bash

NOW=$( date '+%F_%H:%M:%S' )

filename="/home/pi/gets/$NOW.wav"
sox -t alsa plughw:1  "$NOW.wav" & sox_pid="$!"

printf 'sox pid is %d\n' "$sox_pid"

wait

# Alternatively (instead of "wait", if you want to kill sox after six seconds):
# sleep 6 && kill "$sox_pid" 

echo "$filename"

Você obterá o PID do processo sox impresso no terminal e poderá usá-lo para fazer kill pid (com pid substituído por esse número).

Usando & ofte, a invocação de sox a coloca em segundo plano. O PID dessa tarefa em segundo plano é armazenado automaticamente em $! e o código acima atribui a sox_pid , que é posteriormente impresso.

O comando wait aguarda que o comando sox (executando em segundo plano) termine.

Como discutimos em uma sessão anterior : cite duas expansões de variáveis.

    
por 06.03.2018 / 12:14
0

kill -SIGINT <pid> é o equivalente usual a ^C .

    
por 06.03.2018 / 12:14
0

use trapping:

#!/bin/bash

# this is a trap for ctrl + c 
trap ctrl_c INT

function ctrl_c() 
{
  echo "Trap: CTRL+C received, exit"
  exit
}
    
por 06.03.2018 / 12:22