Controle de job sobre um script Bash

1

Eu tenho um script Bash de mil linhas, cada uma contendo um comando ffmpeg . Eu começo isto com source script e corre muito bem.

No entanto, quando tento assumir o controle desse script de várias maneiras, as coisas ficam completamente erradas:

  • Se eu faço Ctrl + Z para pausar a coisa toda, somente o comando atual ffmpeg é pausado, e o próximo é iniciado! Não é o que eu queria!
  • Se eu faço Ctrl + C para parar tudo, o script pula para o próximo comando ffmpeg , e eu tenho que pressionar uma vez para cada linha no script para finalmente pare tudo. Inferno absoluto.
  • Eu tentei usar ps -ef de outro shell para localizar o comando source para pausar / eliminá-lo de lá, mas ele não existe na lista.

Então, como posso pausar / parar o script pai da maneira que desejo? Ou possivelmente, como posso executar o script de uma maneira diferente para começar, o que me dá o controle adequado sobre isso?

    
por forthrin 28.08.2015 / 15:01

2 respostas

4

Tente executar o script como um script em vez de pesquisá-lo:

$ bash <scriptname>
    
por 28.08.2015 / 15:24
0

O problema é que ffmpeg captura o SIGINT - sinal enviado por Ctrl + C - mas ele é ignorado no bash, pois não sabe se o sinal é destinado a ele também.

Um remédio para isso é adicionar uma trap para o sinal no script e tratá-lo localmente.

Por exemplo, adicione uma armadilha ao início do arquivo com comandos. Em seguida, torne-o executável e execute-o ou por % $ bash script_file - não source :

trap 'exit' INT

Uma linha mais chique que aborta com mensagem e status de saída 130 :

trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT

Então:

$ ./file_with_commands

Ou um script matador de sourcing:

#!/bin/bash

trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT

source "$1"

Então:

$ ./sourcetrap file_with_commands

Um exemplo simples de script pode ser:

#!/bin/bash

if [[ $1 = trap ]]; then
    trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
fi

ping localhost
ping localhost
ping localhost
  • Executar sem interceptação: ./script_name
  • Com trap: ./script_name trap

Então Ctrl + C para testemunhar a diferença.

E novamente; não source estes scripts do terminal.

    
por 28.08.2015 / 15:28