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 № 1Quando 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 kill
e 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à.