jython moord ouder proces dat spawnt subproces onderbreekt subproces stdout naar bestand?

Laat me beginnen met wat ik echt probeer te doen. We willen een platformonafhankelijk opstartscript voor het oproepen van een JVM met enkele systeemeigenschappen en een dynamisch gegenereerd klassenpad. We hebben met name Jython gekozen omdat we alleen afhankelijk moeten zijn van de stand-alone jython.jar in ons opstartscript. We besloten dat we een jython-script kunnen schrijven dat gebruikmaakt van subprocess.Popen om de jvm van onze applicatie te starten en vervolgens te beëindigen.

Nog een ding. Onze applicatie gebruikt veel oude foutopsporingscodes die standaard worden afgedrukt. Dus het opstartende script heeft typisch stdout/stderr omgeleid naar een logbestand. Ik probeerde dat te reproduceren met ons jython-script als volgt:

subprocess.Popen(args,stdout=logFile,stderr=logFile)

Na deze regel eindigt het opstartscript en de hosting van jvm voor jython. Het probleem is dat niets in het logbestand verschijnt. Als ik dit in plaats daarvan doe:

subprocess.Popen(args,stdout=logFile,stderr=logFile).wait()

dan krijgen we logs. Dus het parent-proces moet parallel lopen aan het aanvraagproces dat via subprocessen wordt gestart? Ik wil voorkomen dat twee jvms worden uitgevoerd.

Kun je subproces op zo'n manier aanroepen dat het stdout-bestand wordt geschreven, zelfs als het bovenliggende proces wordt beëindigd? Is er een betere manier om de applicatie jvm van jython te starten? Is Jython sowieso een slechte oplossing?

1

1 antwoord

We willen een platformonafhankelijk opstartscript voor het oproepen van een JVM met enkele systeemeigenschappen en een dynamisch gegenereerd klassenpad.

U kunt een platformonafhankelijk script gebruiken om een ​​platformspecifiek opstartscript te genereren tijdens de installatie of vóór elke aanroep. In het laatste geval hebt u bovendien een eenvoudig, statisch platformspecifiek script nodig dat uw platformonafhankelijke opstartscript-genererende script en vervolgens het gegenereerde script zelf oproept. In beide gevallen start u uw toepassing door een statisch platformspecifiek script aan te roepen.

Kun je subprocess op zo'n manier oproepen dat het stdout-bestand wordt geschreven, zelfs als het bovenliggende proces wordt beëindigd?

U zou een bestand/redirect in een kindproces kunnen openen, bijvoorbeeld met shell:

Popen(' '.join(args+['>', 'logFile', '2>&1']), # shell specific cmdline
      shell=True) # on Windows see _cmdline2list to understand what is going on
1
toegevoegd
@tal: Neem een ​​kijkje op jython 'own StartScriptGenerator.java en shellscripts
toegevoegd de auteur jfs, de bron
Bedankt! Met shell = True en piping werkte de uitvoer. Nu is mijn enige probleem dat opstarten vrij langzaam is, gezien het feit dat ik een jvm aan het bedenken ben om een ​​opstartscript uit te voeren voor het aanmaken van een jvm. Je eerste optie zou dat oplossen, maar ik weet niet zeker hoe je dat zou aanpakken? Zijn er enkele bibliotheken of hulpmiddelen voor het converteren van een bepaalde subset van python of iets anders naar Windows Bat of bash-scripts?
toegevoegd de auteur kenen, de bron