man kennt es ja:
killproc -TERM /usr/local/bin/xyz-app
somit kille ich alle prozesse dieser ausführbaren datei. doch wie ist es nun wenn ich eine anwendung anhand eines ports kilen will?
also statt pfadangabe, muss man den port reinschreiben oder so, den die anwendung die gekillt werden soll an sich gebunden hat!
danke an alle hilfe!
Anwendung anhand eines ports terminieren?
Re: Anwendung anhand eines ports terminieren?
lsof erschlägt das Problem fast von alleine:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash
# Skript: killport
# Zweck: Killt Prozesse, die an einem bestimmten Port hängen
# Voraussetzungen:
# lsof
case $# in
0) echo "Nicht genügend Argumente." >&2
exit 1
;;
1) SIGNAL="-TERM"
PORT="$1"
;;
2) SIGNAL="$1"
PORT="$2"
;;
*) echo "Zuviel Argumente." >&2
exit 1
;;
esac
lsof -i :$PORT -t | xargs kill $SIGNAL
exit 0</font><hr></pre></blockquote>lsof gibt nur die PIDs aus (-t) von Prozessen, die am übergebenen Port hängen (-i :$PORT). Das darf sowohl in der numerischen als auch in der textuellen Angabe erfolgen, also sind sowohl "25" als auch "smtp" gültig. Aus den PIDs bastelt dann xargs nur noch ein passendes kill-Kommando zusammen.(Zum Testen kann man zwischen "xargs" und "kill" noch ein "echo" setzen, dann sieht man, welches Kommando xargs zusammenbaut, ohne dass es ausgeführt wird.) Das case-Statement vorher ist nur dafür da, die übergebenen Parameter von der Anzahl her zu testen. Hier kann man das Skript auch noch etwas ausbauen, beispielsweise mit einer Usage-Meldung oder einer tiefergehenden Überprüfung der Parameter oder mit der Möglichkeit, mehr als nur einen Port zu übergeben usw.
Jochen
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash
# Skript: killport
# Zweck: Killt Prozesse, die an einem bestimmten Port hängen
# Voraussetzungen:
# lsof
case $# in
0) echo "Nicht genügend Argumente." >&2
exit 1
;;
1) SIGNAL="-TERM"
PORT="$1"
;;
2) SIGNAL="$1"
PORT="$2"
;;
*) echo "Zuviel Argumente." >&2
exit 1
;;
esac
lsof -i :$PORT -t | xargs kill $SIGNAL
exit 0</font><hr></pre></blockquote>lsof gibt nur die PIDs aus (-t) von Prozessen, die am übergebenen Port hängen (-i :$PORT). Das darf sowohl in der numerischen als auch in der textuellen Angabe erfolgen, also sind sowohl "25" als auch "smtp" gültig. Aus den PIDs bastelt dann xargs nur noch ein passendes kill-Kommando zusammen.(Zum Testen kann man zwischen "xargs" und "kill" noch ein "echo" setzen, dann sieht man, welches Kommando xargs zusammenbaut, ohne dass es ausgeführt wird.) Das case-Statement vorher ist nur dafür da, die übergebenen Parameter von der Anzahl her zu testen. Hier kann man das Skript auch noch etwas ausbauen, beispielsweise mit einer Usage-Meldung oder einer tiefergehenden Überprüfung der Parameter oder mit der Möglichkeit, mehr als nur einen Port zu übergeben usw.
Jochen
Re: Anwendung anhand eines ports terminieren?
Hallo Holger
mir ist momentan nicht so richtig klar was Du damit bezweckst. An deiner stelle würde ich ewentuell mal über einen Packetfilter und/oder Proxy (für die Anwendungsschicht ) nachdenken. Das funktioniert von Außen und auch von Innen. Vieleicht solltest Du dir auch mal den Befehl "skill" ansehen mit ihm kannst Du z.B. Terminals (tty oder pty) oder User (komplett) usw killen.
mdMmDs vi-vi
mir ist momentan nicht so richtig klar was Du damit bezweckst. An deiner stelle würde ich ewentuell mal über einen Packetfilter und/oder Proxy (für die Anwendungsschicht ) nachdenken. Das funktioniert von Außen und auch von Innen. Vieleicht solltest Du dir auch mal den Befehl "skill" ansehen mit ihm kannst Du z.B. Terminals (tty oder pty) oder User (komplett) usw killen.
mdMmDs vi-vi
Re: Anwendung anhand eines ports terminieren?
es eght darum, das ich ein webinterface schreiben will, was ein programm (spezifisch HLDS Half-Life-Dedicated-Server) steuern soll. nun muss ich (da es ja sein kann das ich MEHRERE HLDS-Server mit verschiedenen ports habe) nur EINES dieser Programme anhand des PORTS terminieren. ich denke mit dem obigen script kommt man gut zu recht ... gibt es noch bessere (bzw. einfachere) methoden???
Re: Anwendung anhand eines ports terminieren?
Kenne den HLDS nicht weiter. Aber häufig schreiben Linux-Dienste ihre PID in eine Datei unter /var/run. Notfalls müsste man ein Startskript basteln, welches diese Aufgabe übernimmt. Abschiessen liessen sich die Server dann über ein "kill `cat /var/run/HLDS-<i>X</i>.pid`", mit X als einer eindeutigen Kennung für den Server. Das sollte man dann allerdings auch in das Kript packen und danach das .pid-File löschen.
Jochen
Jochen
Re: Anwendung anhand eines ports terminieren?
nun HLDS ist ein auf der GDB basienden routinen, welches sich einen von mir angewiesenen port krallt. kannst du mir ein beispiel geben WIE man die PID in die PID-FILE schreibt? das würde nähmlich ein sehr guter ausweg sein, um anzeigen zu lassen, welcher server LÄUFT und welcher nicht (je nachdem er eine PID hat oder eben nicht!).
danke aber erstmal an alle die bis hierher geholfen haben. hr habt mich echt ein grosses stück weitergebracht ))
danke aber erstmal an alle die bis hierher geholfen haben. hr habt mich echt ein grosses stück weitergebracht ))