Domanda

Come si può sopprimere l' Terminated il messaggio che arriva dopo aver ucciso un processo in uno script bash?

Ho provato set +bm, ma che non funziona.

So un'altra soluzione implica la chiamata exec 2> /dev/null, ma è che affidabile?Come faccio a resettare di nuovo in modo che io possa continuare a vedere stderr?

È stato utile?

Soluzione

La risposta breve è che non si può.Bash stampa sempre lo stato di primo piano posti di lavoro.Il monitoraggio bandiera si applica solo per i processi in background, e solo per le shell interattive, non script.

vedere notify_of_job_status() in posti di lavoro.c.

Come dici tu, è possibile reindirizzare in modo che l'errore standard è che punta a /dev/null ma poi si dimentica di altri messaggi di errore.Si può fare temporanea facendo il reindirizzamento in un processo che viene eseguito lo script.Questo lascia l'ambiente originale da solo.

(script 2> /dev/null)

che le farà perdere tutti i messaggi di errore, ma solo da quello script, non da niente altro in esecuzione nella shell.

È possibile salvare e ripristinare l'errore standard, reindirizzando un nuovo filedescriptor per punto:

exec 3>&2          # 3 is now a copy of 2
exec 2> /dev/null  # 2 now points to /dev/null
script             # run script with redirected stderr
exec 2>&3          # restore stderr to saved
exec 3>&-          # close saved version

Ma io non lo consiglio, l'unica testa dal primo, è che si salva un sub-shell invocazione, pur essendo più complicato e, possibilmente, anche la modifica del comportamento dello script, se lo script modifica descrittori di file.


EDIT:

Per ulteriori risposta appropriata controlla la risposta data da Mark Edgar

Altri suggerimenti

In ordine al silenzio il messaggio, è necessario reindirizzare stderr il messaggio è generato.Perché il kill comando invia un segnale e non attendere che il processo di destinazione per rispondere, reindirizzando stderr del kill comando non fa nulla di buono.Il comando interno di bash wait è stata fatta appositamente per questo scopo.

Qui è un esempio molto semplice che uccide l'ultima sfondo di comando.(Imparare più circa $!qui.)

kill $!
wait $! 2>/dev/null

Perché sia kill e wait accettare più pid, si può anche fare un batch uccide.Qui è un esempio che uccide tutti i processi in background (l'attuale processo/script ovviamente).

kill $(jobs -rp)
wait $(jobs -rp) 2>/dev/null

Mi è stato portato qui da bash:uccidi silenziosamente in background funzione del processo.

Ispirato Marzo la risposta.Stavo usando kill -INT come egli suggerisce, con un certo successo, ma ho notato che non era l'uccisione di alcuni processi.Dopo il test di alcuni altri segnali vedo che SIGPIPE sarà uccidere anche senza un messaggio.

kill -PIPE

o semplicemente

kill -13

Soluzione:utilizzare SIGINT (funziona solo in non-shell interattive)

Demo:

cat > silent.sh <<"EOF"
sleep 100 &
kill -INT $!
sleep 1
EOF

sh silent.sh

http://thread.gmane.org/gmane.comp.shells.bash.bugs/15798

Forse staccare il processo dalla shell corrente processo chiamando disown?

Questo è quello che stiamo tutti cercando?

Non volevo:

$ sleep 3 &
[1] 234
<pressing enter a few times....>
$
$
[1]+  Done                    sleep 3
$

Voluto:

$ (set +m; sleep 3 &)
<again, pressing enter several times....>
$
$
$
$
$

Come si può vedere, il lavoro non lo messaggio di fine.Per me funziona in bash script anche ucciso i processi in background.

'set +m' disabilita il controllo del lavoro (vedere 'aiutare a impostare') per la shell corrente.Quindi, se si immette il comando in una subshell (come fatto qui in parentesi) non influenza il lavoro di controllo delle impostazioni della shell corrente.Unico svantaggio è che è necessario per ottenere il pid del tuo processo in background tornare nella shell corrente se si desidera controllare se ha risolto, o valutare il codice di ritorno.

Un altro modo per disattivare le notifiche processo è al posto di comando per essere sullo sfondo in un sh -c 'cmd &' costrutto.

#!/bin/bash
# ...
pid="`sh -c 'sleep 30 & echo ${!}' | head -1`"
kill "$pid"
# ...

# or put several cmds in sh -c '...' construct
sh -c '
sleep 30 &
pid="${!}"
sleep 5 
kill "${pid}"
'

Questo funziona anche per killall (per chi la preferisce):

killall -s SIGINT (yourprogram) 

elimina il messaggio...Sono stato in esecuzione mpg123 in modalità background.Avrebbe silenziosamente essere ucciso mediante l'invio di una combinazione di tasti ctrl-c (SIGINT) invece di un segnale SIGTERM (impostazione predefinita).

disconoscere ha fatto esattamente la cosa giusta per me -- exec 3>&2 è rischioso per un sacco di ragioni-set +bm non sembra funzionare all'interno di uno script, solo al prompt dei comandi

Avuto successo con l'aggiunta di 'jobs 2>&1 >/dev/null"per lo script, non di certo se ti aiuta chiunque altro script, ma qui è un esempio.

    while true; do echo $RANDOM; done | while read line
    do
    echo Random is $line the last jobid is $(jobs -lp)
    jobs 2>&1 >/dev/null
    sleep 3
    done

Ho scoperto che mettendo il comando kill in una funzione e quindi mettendole in background la funzione elimina la risoluzione di uscita

function killCmd() {
    kill $1
}

killCmd $somePID &

Semplice:

{ kill $! } 2>/dev/null

Vantaggio?possibile utilizzare qualsiasi segnale

ex:

{ kill -9 $PID } 2>/dev/null
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top