Funktioniert `kill -p` wirklich?

11

In der Manpage killsteht wie folgt geschrieben

ZUSAMMENFASSUNG

  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.

Aber da ich es sowohl in RH als auch in RHEL oft versucht habe, hat der Befehl wie kill -s SIGHUP |-p 123nie funktioniert und es wird immer ein Fehler gemeldet

bash: -p: Befehl nicht gefunden

Habe ich Fehler gemacht?

user43312
quelle
11
Beachten Sie, dass , wenn Sie in dem Befehl eingegeben haben , Sie die entfernten [ ]Klammern und ersetzt signalmit SIGHUPund pidmit 123? Warum hast du das getan? Weil Sie wissen , dass die Symbole [, signalund pidsind Meta-syntaktische, anstatt wörtlich zu nehmen . Sie geben die Syntax an. Nun, das |Symbol ist dasselbe: ein weiterer metasyntaktischer Indikator für die Syntax. [a | b]bedeutet: optionales syntaktisches Element, das entweder aoder sein kann b(aber nicht beide, da es ein Element sein muss).
Kaz
Vielen Dank für Ihre Anweisung. Wie sprichst du übrigens aus [a | b]?
user43312
Hmm. "Optional A oder B".
Kaz

Antworten:

51
kill [ -s signal | -p ]

Diese Syntax in einer Handbuchseite bedeutet:

Sie können verwenden kill -s signal oder Sie können verwenden kill -p, aber Sie können nicht beide -sund -pgleichzeitig verwenden.

Die Pipe ( |) steht für (exklusiv) oder ist in der Dokumentation nicht Teil des Befehls.

Wenn Sie tippen

foo | bar

In Ihrer Shell wird versucht, die Ausgabe von zu starten foound an das Programm weiterzuleiten. (Das ist die Shell, die das tut, nicht (oder ), die wird an keinen der Prozesse übergeben.) In Ihrem Fall ist der zweite Teil , also versucht die Shell, eine aufgerufene ausführbare Datei zu finden, und schlägt mit dieser Fehlermeldung fehl.barfoobarfoobar|-p 123-p

Matte
quelle
Danke, @Mat. Also gebe ich einen Befehl wie kill -p 123. Es heißt bash: kill: p: invalid signal specification. Und kill -p SIGINT 123sagt das Gleiche. Ich glaube nicht, dass es Platz gibt, um das Signal gemäß der Syntax zu setzen. Stört es Sie, wenn Sie nur die Verwendung der -pOption demonstrieren ?
user43312
2
@ user43312: siehe slms Antwort darauf
Mat
32

Ich denke, Sie werden über die Tatsache gestolpert, dass es einen eingebauten Befehl für Bash gibt kill, der zusammen mit dem Befehl aufgerufen wird kill.

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

Die Manpage, die Sie lesen, bezieht sich auf den killBefehl unter /bin. Verwenden Sie den vollständigen Pfad, um ihn zu beschwören:

$ /bin/kill -p sleep
16486

Das ist übrigens /usr/bin/killnur ein Link zu /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
quelle
Das funktioniert wirklich. Und ich schätze für alle Demos.
user43312
@ user43312 - NP. Beispiele sind immer leichter zu befolgen als Manpages 8-).
slm