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 № 1Cuando 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.