2011-11-10 14 views
7

corro uno script come:Come schermare l'uscita uccidere

sleep 20 & 
PID=$! 
kill -9 $PID >/dev/null 2>&1 

Non voglio lo script di mostrare l'output come:

line 51: 22943 Killed sleep 

non ho idea del perché questo accada, ho reindirizzare l'output in/dev/null

risposta

15

Il messaggio non viene da kill o il comando background, viene da bash quando rileva che uno dei suoi processi in background è stato ucciso. Per evitare il messaggio, utilizzare disown per rimuoverlo dal controllo dei job di bash:

sleep 20 & 
PID=$! 
disown $PID 
kill -9 $PID 
+0

grande, questo è quello che voglio, grazie un uomo molto .. – chemila

+0

disown ha implicazione di shell non inviare 'SIGHUP' al bambino quando termina, vedi [questa domanda] (http://unix.stackexchange.com/domande/3886/differenza-tra-nohup-disconoscere-e). Ecco la [risposta] (http://stackoverflow.com/a/5722850/52499). –

6

Questo può essere fatto utilizzando 'aspettare' + reindirizzamento di attesa a/dev/null:

sleep 2 & 
PID=$! 
kill -9 $PID 
wait $PID 2>/dev/null 
sleep 2 
sleep 2 
sleep 2 

Questo script non dare il messaggio "ucciso":

-bash-4.1$ ./test 
-bash-4.1$ 

Mentre, se si tenta di usare qualcosa come:

sleep 2 & 
PID=$! 
kill -9 $PID 2>/dev/null 
sleep 2 
sleep 2 
sleep 2 

Esso emette il messaggio:

-bash-4.1$ ./test 
./test: line 4: 5520 Killed     sleep 2 
-bash-4.1$ 

Mi piace questa soluzione molto più rispetto all'utilizzo di 'rinnegare' che possono avere altre implicazioni.

fonte Idea: https://stackoverflow.com/a/5722850/1208218

+0

Questo può essere leggermente migliorato cambiando l'istruzione kill -9 in: kill -9 $ PID 2>/dev/null Questo perché l'uccisione può anche emettere altri messaggi come: riga 3: kill: (3968) - Nessun processo simile A seconda di cosa sta facendo lo script – Roel

-1

Un altro modo per disattivare le notifiche di lavoro è quello di mettere il comando da backgrounded in un sh -c 'cmd &' costrutto.

#!/bin/bash 

# ... 

sh -c ' 
sleep 20 & 
PID=$! 
kill -9 $PID # >/dev/null 2>&1 
' 

# ... 
-1

sono stato in grado di realizzare questo reindirizzando l'output del comando che sto facendo funzionare in background. Nel tuo caso sarebbe simile:

sleep 20 >>${LOG_FILE} 2>&1 & 

... o se non si desidera che un file di log:

sleep 20 &> /dev/null & 

Poi, quando si vuole uccidere quel processo in background PID, lo farà non mostrare sullo standard.