/ / linux shell kill signal SIGKILL && KILL - linux, bash, shell, kill

segnale kill kill di linux SIGKILL && KILL - linux, bash, shell, kill

Ho appena scritto uno script di shell per controllare l'avvio e l'arresto di un modulo. Tutto sembra normale fino a quando non trovo il comando di arresto in qualcosa di inaspettato.

Io uso il comando kill -s SIGKILL -- -gpid per uccidere un gruppo di processi. Io uso il /bin/sh per eseguire il comando in questo modo

/bin/sh -c "kill -s SIGKILL -- -gpid"

che ha risposto all'errore

/ bin / sh: linea 0: kill: SIGKILL: specifica del segnale non valida

Quindi ho sostituito il /bin/sh con /bin/bash, quindi il comando è

/bin/bash -c "kill -s SIGKILL -- -gpid"

che non ha risposto a nessun errore. quindi concludo la spiegazione che la differenza tra bash e sh causa il risultato. Tuttavia, quando io ls il /bin/sh, Ho trovato il /bin/sh è un collegamento simbolico a /bin/bash, quindi il comando dovrebbe essere lo stesso.

Ho trovato la sintassi del comando kill -s SIGKILL non è raccomandato nella sintassi, kill -s KILL consigliato.

così ho sostituito SIGKILL con KILL, il comando è

/bin/sh -c "kill -s KILL -- -gpid"

che non ha risposto a nessun errore. come descritto sopra, chiunque potrebbe spiegare questo caso.

risposte:

3 per risposta № 1

Quando bash viene invocato come sh (ad es. tramite symlink, come nel tuo caso), utilizza a sh modalità di compatibilità in cui le funzionalità più moderne sono disattivate. Scommetto sh sta chiamando il binario esterno per kille non lo riconosce SIGKILL, ma l'invocazione di bash sta usando il suo builtin, e quel builtin lo fa.


3 per risposta № 2

Il solo veramente il modo portatile per scrivere questo comando è

kill -9 -$gpid

Nessuna dei modi per specificare un segnale nome piuttosto che un numero di segnale funziona sugli Unixche ha congelato i loro programmi di utilità della shell a metà degli anni '90, praticamente tutti tranne Linux e i BSD open source. Tuttavia, SIGKILL è affidabile segnale numero 9 ed è sempre stato così (dal V7 se non prima).

L'argomento speciale -- non è portatile, e in questo caso non è necessario.

Se vuoi essere un po 'più educato al riguardo (inviando invece SIGTERM), usa

kill -15 -$gpid

Ancora una volta, quel numero è affidabile fino al V7.


2 per risposta № 3

È tutta una questione di bash compatibilità. Correzione rapida da usare /bin/bash perché sh non è possibile riconoscere SIGINT o altre funzionalità.