2016-06-01 9 views
0

Ich schrieb einen Alias ​​in meinem Bash-Profil, um mir zu helfen, Rogue-Rails-Server-Prozesse zu beenden, die nicht sauber schließen. Dieser Alias ​​funktioniert gut.Übergeben einer Portnummer an lsof in einer Shell-Funktion

alias kill3000="lsof -i tcp: 3000 -t | xargs kill -9 | echo 'killed processes on port 3000'" 

Ich wollte es allgemeiner machen, für Frameworks, die an anderen Ports arbeiten. Ich habe versucht, eine ähnliche Funktion zu machen, also könnte ich die Portnummer als Variable übergeben, aber ich bekomme einen Fehler. Die Funktion, die ich schrieb wie folgt aussieht ...

function killproc(){ 
    "lsof -i tcp:$1 -t | xargs kill -9 | echo 'killed processes on port $1'" 
} 

Allerdings, wenn ich „killproc 3000“ laufen, ich folgende Fehlermeldung erhalten:

lsof: unacceptable port specification in: -i tcp: 

ich kämpfen werde, das Problem zu verstehen, ich schätze jede Hilfe.

+1

zitieren die ganze Zeile "" lsof -i ... getötet .. $ '"' sieht verdächtig aus. Um die Situation zu debuggen, lerne 'set -vx; ... cmd ....; Setzen Sie + vx', um zu sehen, wie die Shell Ihren Code interpretiert. Die mit '+' beginnenden Zeilen zeigen alle Variablenwerte an ihrem Platz. Alle '' dbl-quotierten Strings sind "normalisiert" auf ''' single-quoted strings. Viel Glück. – shellter

+0

Danke, 'set-vx' war sehr hilfreich bei der Suche nach dem Problem. Die Variable wurde wiederholt, so dass es gesucht wurde für Port 3000 3000, die den Fehler verursacht. Ich bin mir nicht sicher, warum genau das geschah, aber das Ausführen von 'exec bash' löste das Problem für mich. Vielen Dank für die Hilfe! –

Antwort

1

Vielleicht sind die doppelten Anführungszeichen beteiligt.

einen Versuch dieses Geben Sie:

function killproc(){ 
    lsof -i tcp:"$1" -t | xargs kill -9 
    lsof -i tcp:"$1" -t 2>/dev/null >/dev/null || printf "killed processes on port %s\n" "$1" 
} 

Die Meldung wird nur gedruckt, wenn es nicht mehr Prozess auf den Port pspecified gefunden ist zu hören.

Wenn Sie Probleme haben, folgen Sie den Anweisungen von @shellter. Führen Sie einen Test mit set -vx ; killproc 300 ; set +vx aus und bearbeiten Sie die Frage, um die generierte Ausgabe hinzuzufügen.

+0

Vielen Dank, Ihre Antwort (und @ Shellters Kommentar) half mir, es herauszufinden, meine Variable duplizierte, so wurde "3000" zu "3000 3000". Nicht sicher, warum, aber die Umgebung mit 'exec bash 'zu verbessern, löste es. Ihre Funktion funktioniert großartig. –

Verwandte Themen