como parar o bash dos alertas de impressão?

2

Ao matar um processo com kill -9 $PID &>/dev/null em um script, uma mensagem ainda é impressa no terminal após o próximo comando terminar. Como você interrompe esse comportamento?

Por exemplo

while true; do
    /usr/bin/dostuff -a -b -c
    PID=$(pidof -o %PPID /usr/bin/dostuff)
    sleep 1; 
    kill -KILL $PID &>/dev/null
    echo "hello"
done

imprime algo como

hello
./my-cript.sh: line 12:  7134 Killed
/usr/bin/dostuff -a -b -c

Quando só quero imprimir "olá"

EDITAR: A solução limpa é executar o programa em um subshell ou ignorá-lo.

#SOLUTION
while true; do
    /usr/bin/dostuff -a -b -c &
    disown
    PID=$!
    sleep 1; 
    kill -KILL $PID &>/dev/null
    echo "hello"
done
    
por brice 18.02.2010 / 00:32

3 respostas

4

As linhas de saída não são redirecionadas para / dev / null porque não são STDOUT / STDERR do processo kill . Eles são produzidos pelos mecanismos de controle de tarefas do shell.

Se você estiver usando bash , poderá executar um rejeitar imediatamente após a invocação da tarefa:

while true; do
    /usr/bin/dostuff -a -b -c

    ### remove from shell job table
    disown

    PID=$(pidof -o %PPID /usr/bin/dostuff)
    sleep 1; 
    kill -KILL $PID &>/dev/null
    echo "hello"
done

Eu testei isso em bash v3.2.39 no Debian Lenny, com /bin/sleep 10 & no lugar do comando /usr/bin/dostuff acima:

./tmp.sh
hello
hello
hello
hello
^C
    
por 18.02.2010 / 00:55
3

O redirecionamento de erros é ineficaz porque esta mensagem não é impressa por kill; ele é impresso pelo shell quando o job em background é encerrado (suponho que um & estava faltando).

Você pode evitar isso executando em um subshell, usando parênteses (mas esteja ciente de outros possíveis problemas):

while true; do
    (
    /usr/bin/dostuff a b c &
    PID=$!
    sleep 1
    kill -9 $PID
    )
    echo hello
done
    
por 18.02.2010 / 00:55
0

Você pode fazer set -b e instalar uma armadilha no SIGCHLD. Eu acho que o manipulador SIGCHLD padrão é o que irá (imediatamente) imprimir o status do trabalho para o terminal quando você tiver set -b . Aqui você estaria ignorando isso.

    
por 18.02.2010 / 01:00