Come eliminare Terminato il messaggio, dopo l'uccisione in bash?
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?
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
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