Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Python script killen

Pagina: 1
Acties:

  • Brainscrewer
  • Registratie: Juli 2009
  • Laatst online: 22-10 18:13
Beetje cryptische topictitel, maar ik hoop dat ik het hieronder wat beter kan beschrijven :P

Ik heb enige Java kennis en an sich valt C# me niet heel slecht, om het een beetje te leren ben ik op t moment een kleine applicatie aan het schrijven waarmee ik sommige applicaties automatisch kan starten of stoppen.

Deze applicaties zijn geschreven in python (extensie .py) en starten op in een webbrowser, elke applicatie luistert naar zijn eigen poortnummer, applicatie één luistert dus naar bijvoorbeeld poort 8585 en applicatie twee naar 8586.

In de taskmanager hebben de applicaties dezelfde naam (pythonw.exe), dus killen op basis van naam zal helaas (denk ik) niet lukken. Voor één applicatie is het ondertussen gelukt, deze had wel een eigen taaknaam. Het hierboven beschreven scenario geldt dus voor de twee overgebleven scripts. Het gaat er dus om dat ik een applicatie kan killen die luistert op een bepaalde poort. Het is me al wel gelukt om te kijken of de poort in gebruik is.

Mijn vraag: zijn er mensen die ervaring hiermee hebben of eventueel al eens hetzelfde hebben geprobeerd? Ik weet namelijk op dit moment niet hoe ik dit verder zou moeten aanpakken. Suggesties zijn ook zeker welkom!

Ik heb ondertussen wel deze library gevonden, maar deze stamt uit 2003 en werkt volgens mij niet helemaal goed. (als ik het artikel mag geloven werkt de koppeling tussen processID en naam alleen in Windows XP). Ik ontwikkel trouwens in C# en .NET Framework 4.5

Ik ben benieuwd naar jullie antwoorden :)

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Met behulp van 'netstat -o' kan je het process id op poort niveau krijgen, en met 'kill' kan je per PID killen.

Als je deze 2 programma's kan aansturen moet het lukken.

Voorbeeldje van netstat (-n voor numerieke poorten):
code:
1
2
3
4
5
6
7
8
9
>netstat -ano

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       10680
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       848
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       2532
etc.

[ Voor 29% gewijzigd door HMS op 08-02-2013 02:14 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik weet niet welke methode je gebruikt om de processen te starten of killen (er zijn meer wegen die naar Rome leiden ;) ), maar aangenomen dat je Process.Start gebruikt: die method returned toch een Process welke, o.a., Id heeft :?

Als je applicatie verantwoordelijk is voor 't starten en stoppen van de processes, wat je aangeeft in je TS, dan kun je toch gewoon onthouden welk proces op welke poort is gestart (in een Dictionary<int, Process> ofzo)? Sterker nog: dan hoef je niet eens met process-id's te klooien, je kunt gewoon meteen de Kill() method gebruiken als volgt: MyProcessesDictionary\[8585].Kill()

[ Voor 15% gewijzigd door RobIII op 08-02-2013 23:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Dat is inderdaad de beste oplossing als je kan specificeren / zeker weet op welke poort de applicatie draait.

Verwijderd

Als je alleen de instance van Python wilt beëindigen dan zou dit moeten werken
C#:
1
2
3
4
5
6
7
8
9
10
11
12
class KillProcess
{
    public static void KillPythonInstances()
    {
        Process[] pythonInstances = Process.GetProcessesByName("pythonw");
        foreach (Process p in pythonInstances)
        {
            if (!p.Responding)
                p.Kill();
        }
    }
}

De code controleert eerst alle lopende instances van "pythonw" en vervolgens controleert deze of ze nog reageren, zo niet dan worden deze beëindigd.
Let wel op dat hier geen eventuele uitzonderingen worden behandeld, dat zou je eventueel zelf moeten doen. }:O
Ik hoop dat je hier iets mee kunt, wat betreft C# is MSDN echt een schatkist wat betreft informatie voorziening! ;)

Succes!

[ Voor 7% gewijzigd door Verwijderd op 08-02-2013 11:33 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
In principe is het niet helemaal goed om processen te killen, afhankelijk van het proces kun je dan een inconsistente staat krijgen. Graceful shutdown lijkt me beter. ;)

Voor het zoeken zou ik liefst niet op poortnummer werken, dat werkt vrij fragiel. Als de poort bezet was, het proces de poort op heeft gegeven, e.d., zou het proces alsnog kunnen blijven draaien.

Het lijkt me handiger om naar de volledige commandline of andere procesinfo te kijken, die is vast ergens anders. Met een WMI-query kun je het juiste processId achterhalen, zie bijvoorbeeld http://stackoverflow.com/...l-path-of-running-process (2e antwoord).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 08 februari 2013 @ 11:32:
Als je alleen de instance van Python wilt beëindigen dan zou dit moeten werken
Hij wil een specifieke instance van Python beëindigen ;)
pedorus schreef op vrijdag 08 februari 2013 @ 11:52:
Voor het zoeken zou ik liefst niet op poortnummer werken, dat werkt vrij fragiel.
Hij start proces A op poort 123
Hij start proces B op poort 456
Als 'ie dan in een dictionary het Process object vast houdt met op welke poort het gestart is (wat dan in feite fungeert als een "unieke" identifier) kan het niet mis en is er niets fragiels aan; enige wat je moet doen is zorgen dat je niet twee keer een proces op dezelfde poort start. En hey, laten we dat nou makkelijk kunnen checken met if (!MyDictionary.ContainsKey(123)) { //start process for port 123 } ;)
pedorus schreef op vrijdag 08 februari 2013 @ 11:52:
Het lijkt me handiger om naar de volledige commandline of andere procesinfo te kijken, die is vast ergens anders.
Gewoon het Process object dat Process.Start returned in de dictionary mikken; dan heb je alle relevante info altijd bij de hand.
pedorus schreef op vrijdag 08 februari 2013 @ 11:52:
Met een WMI-query kun je het juiste processId achterhalen, zie bijvoorbeeld http://stackoverflow.com/...l-path-of-running-process (2e antwoord).
Maar waarom überhaupt met WMI kloten, commandlines parsen, output van netstart proberen te lezen etc. als je gewoon zélf de processen gestart hebt?

[ Voor 74% gewijzigd door RobIII op 08-02-2013 18:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Process-ids worden hergebruikt op vrijwel alle systemen. Als de boel out of sync raakt knal je dus een willekeurig nieuwer proces af als je niet uitkijkt.. Door iets als WMI te gebruiken werkt het ook als er buiten de start/stop-applicatie om iets is gebeurd.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Tussen de tijd dat je een WMI query doet en 't proces afknalt, ook al doe je 't (in code) achter elkaar binnen een milliseconde, kan de situatie ook veranderd zijn. Dat hou je toch. Een (extra) check kan (in beide gevallen) geen kwaad, zeker niet als je lomp aan 't killen gaat.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als je bang bent voor die ene milliseconde, dan moet je GetProcesses() ietsje naar voren halen in die code op stackoverflow. Onder Windows wordt een process-id niet gerecycled als er nog een handle naar toe is. ;) (Overigens gaat het met een Dictionary<int, Process> dus ook goed vanwege die handle, enkel dan kan de start/stop-applicatie niet onafhankelijk werken)

In dat verband zou de code op stackoverflow die handles trouwens allemaal netjes moeten disposen. Die code is dus niet erg netjes, er zou try/finally en foreach(var p in processes) p.Dispose() of zoiets gebruikt moeten worden.

[ Voor 15% gewijzigd door pedorus op 08-02-2013 22:38 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Brainscrewer
  • Registratie: Juli 2009
  • Laatst online: 22-10 18:13
Bedankt allemaal voor de replies, het is ondertussen gelukt dankzij de oplossingen van RobIII.
Weer een stukje ervaring rijker! :D
Pagina: 1