¿`Kill -p` realmente funciona?

11

En la página del manual killestá escrito de la siguiente manera

SINOPSIS

  kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
  kill -l [ signal ]

  -p     Specify  that kill should only print the process id (pid) of the
          named processes, and not send any signals.

Pero como lo intenté muchas veces en RH y RHEL, el comando kill -s SIGHUP |-p 123nunca funcionó y siempre se informa un error

bash: -p: comando no encontrado

¿Cometí algún error?

usuario43312
fuente
11
Tenga en cuenta que cuando escribió el comando, eliminó los [ ]corchetes y lo reemplazó signalcon SIGHUPy pidcon 123? ¿Por qué hiciste eso? Porque sabes que los símbolos [, signaly pidson meta-sintácticos, en lugar de literales. Indican cuál es la sintaxis. Bueno, el |símbolo es lo mismo: otro indicador meta-sintáctico de sintaxis. [a | b]significa: elemento sintáctico opcional, que puede ser cualquiera ao b(pero no ambos, ya que debe ser un elemento).
Kaz
Gracias por tu instrucción Por cierto, ¿cómo se pronuncia [a | b]?
user43312
Hmm "Opcional A o B".
Kaz

Respuestas:

51
kill [ -s signal | -p ]

Esta sintaxis en una página de manual significa:

Puede usar kill -s signal o puede usar kill -p, pero no puede usar ambos -sy -pal mismo tiempo.

El pipe ( |) significa (exclusivo) o en la documentación, no es parte del comando.

Cuando escribes

foo | bar

en su concha, que intentará arrancar fooy bar, y canalizar la salida de fooal barprograma. (Ese es el shell que hace eso, no foo(o bar), el |no se pasa a ninguno de los procesos). En su caso, la segunda parte es -p 123, por lo que el shell intenta encontrar un ejecutable llamado -py falla con ese mensaje de error.

Estera
fuente
Gracias, @Mat. Entonces doy una orden como kill -p 123. Dice bash: kill: p: invalid signal specification. Y kill -p SIGINT 123dice lo mismo. No creo que haya lugar para poner la señal de acuerdo con la sintaxis. ¿Te importa si solo das una demostración del uso de la -popción?
user43312
2
@ user43312: vea la respuesta de slm para eso
Mat
32

Creo que te estás tropezando por el hecho de que hay un comando incorporado para Bash llamado kill, junto con el comando kill.

$ type -a kill
kill is a shell builtin
kill is /usr/bin/kill
kill is /bin/kill

La página del manual que está leyendo se refiere al killcomando ubicado debajo /bin. Usa la ruta completa para invocarlo:

$ /bin/kill -p sleep
16486

Por cierto, el /usr/bin/killes solo un enlace a /bin/kill.

$ ls -l /usr/bin/kill
lrwxrwxrwx 1 root root 14 Feb  9  2011 /usr/bin/kill -> ../../bin/kill

$ readlink -m /usr/bin/kill
/bin/kill
slm
fuente
Esto realmente funciona. Y lo aprecio por todas las demos.
user43312
@ user43312 - NP. Los ejemplos son siempre más fáciles de seguir que las páginas de manual 8-).
slm