Das betreffende Skript beendet den neuesten Prozess auf meinem Localhost-Port 8080.
#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x
Es hat nicht funktioniert, wenn das Skript den Namen 'killl' hat (bekommen? Kill Latest?). Es gab mir eine Aufforderung, cmdsubst>
das Skript in 'asdf' umzubenennen, alles funktioniert. Gibt es eine Erklärung für dieses Verhalten? Ich benutze MacOS El Capitán.
shell-script
osx
Zeick
quelle
quelle
killl
?killl
kann als falsch geschrieben interpretiert werdenkill
. Es ist besser, explizit und beschreibend zu sein:kill_latest
oderkill_last
.type killl
in der Shell, wo Sie versucht haben, es zu starten?Antworten:
cmdsubst>
ist die sekundäre Eingabeaufforderung, die von derzsh
Shell ausgegeben wird, wenn sie auf das Ende einer eingegebenen Befehlsersetzung wartet.Wenn Sie diese Eingabeaufforderung erst nach der Eingabe erhalten
killl<Return>
, ist die einzige vernünftige Erklärung, dass Sie einen Alias (eine Art Zeichenfolgenmakroerweiterung) habenkilll
, der sich zu etwas erweitert, das eine nicht abgeschlossene$(...)
Befehlsersetzung enthält , wie:Wo werden
zsh
Sie aufgefordert, diese$(...)
Befehlsersetzung zu schließen ?Noch ein paar Anmerkungen:
lsof
wird nach pid sortiert. PID-Nummern werden umgebrochen, eine größere PID ist keine Garantie dafür, dass der Prozess später gestartet wurde.-i:8080
meldet TCP- oder UDP-Sockets, die den 8080-Port als Quell- oder Zielport haben, unabhängig davon, ob es sich um einen empfangsbereiten, akzeptierenden oder verbindenden Socket handelt.-t
Optionen verwendenlsof
:lsof -ti:8080 | tail -n2
kill -9
istkill -s KILL
, was ein Signal sendet, dass die Anwendung nicht ordnungsgemäß beenden kann. Es sollte nur als letztes Mittel verwendet werden.Um den zuletzt gestarteten Prozess abzubrechen, der eine Socket-Bindung (eines der Enden) an Port 8080 aufweist, können Sie Folgendes ausführen:
(setzt GNU
sort
(wie unter macOS) und eineps
Implementierung voraus , die dielstart
Spalte unterstützt (wie bei macOS und procps-ng, obwohl der Code für procps-ng, bei dem die Felder month und day ausgetauscht werden, aktualisiert werden müsste)).quelle
Denn als Sie den Befehl eingegeben haben, haben Sie ihn nicht eingegeben
du hast getippt o.ä. Dies hatte nichts mit dem Namen des Skripts zu tun , oder auch nur damit, dass es sich überhaupt um ein Skript handelte. Sie hätten den gleichen Effekt mit einem völlig nicht existierenden Befehl erzielen können: Der Parser der Shell erwartete, dass mehr Eingaben den nur teilweise vollständigen Befehl vervollständigen würden. Ihr Denken an den Skriptnamen ist ein kompletter roter Hering.quelle
killl $(
aus irgendeinem Grund getippt hat , und es ist sehr unwahrscheinlich, dass er das getan hat. Die Antwort von Stéphane Chazelas ist wahrscheinlicher.`
ist das wahrscheinlicher als$(
.`
ist überhaupt nicht wahrscheinlich, da es nicht die gleiche Eingabeaufforderung gibt . Versuch es. Nein, Herhtar; es ist nicht eine Annahme bei der Eingabe , dass oder ähnlich ist die Art und Weise , dass die Eingabeaufforderung zu erhalten . Es ist ein Abzug.killl
, als, wie Stéphane Chazelas erklärt, es durchaus möglich ist, dass OP tatsächlich getippt hatkilll
. Daher habe ich Ihre Antwort als falsch eingestuft.