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

señal de destrucción de shell de linux SIGKILL && KILL - linux, bash, shell, kill

Acabo de escribir un script de shell para controlar el inicio y la detención de un módulo. Todo parece normal hasta que encuentro que el comando de detención produce algo inesperado.

Yo uso el comando kill -s SIGKILL -- -gpid matar un grupo de procesos. Yo uso el /bin/sh ejecutar el comando así

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

que respondió el error

/ bin / sh: línea 0: kill: SIGKILL: especificación de señal no válida

Luego reemplacé el /bin/sh con /bin/bash, entonces el comando es

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

que no respondió nada error. Así que concluyo la explicación de que la diferencia entre bash y sh causa el resultado. Sin embargo, cuando yo ls el /bin/sh, Encontré la /bin/sh es un enlace simbólico a /bin/bash, por lo que el comando debería ser el mismo.

Encontré la sintaxis del comando kill -s SIGKILL no está en la sintaxis recomendada, kill -s KILL recomendado.

así que reemplacé el SIGKILL con KILL, el comando es

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

que no respondió nada error. como se describió anteriormente, cualquiera podría explicar este caso.

Respuestas

3 para la respuesta № 1

Cuando bash se invoca como sh (por ejemplo, a través del enlace simbólico, como en su caso), utiliza un sh modo de compatibilidad donde la mayoría de las funciones modernas están desactivadas. Yo apostaría sh está llamando al binario externo para kill, y no reconoce SIGKILL, pero la invocación bash está utilizando su incorporado, y ese incorporado lo hace.


3 para la respuesta № 2

Lo único verdaderamente forma portátil de escribir este comando es

kill -9 -$gpid

Ninguna de las formas de especificar una señal nombre en lugar de un número de señal de trabajo en los Unixesque congeló sus utilidades de shell a mediados de los 90, que básicamente son todas excepto Linux y los BSD de código abierto. Sin embargo, SIGKILL es confiablemente la señal número 9 y siempre lo ha sido (desde V7 si no antes).

El argumento especial -- tampoco es portátil, y es innecesario en este caso.

Si quieres ser un poco más cortés al respecto (enviando SIGTERM en su lugar), usa

kill -15 -$gpid

Una vez más, ese número es confiable hasta V7.


2 para la respuesta № 3

Se trata de compatibilidad bash. Solución rápida para usar /bin/bash porque sh no puede reconocer SIGINT u otras características.