Elternprozess beenden



  • Hi zusammen

    Um alle Dienste unserer Applikation sauber via SIGTERM zu beenden und nach einer maximalen Reaktionszeit einen Neustart zu erzwingen, haben wir folgendes Skript erstellt:

    #!/bin/sh
    export remote='emc-remote'
    export harvester='emc-harvester'
    export maxWaitTime=90
    
    kill -SIGTERM `ps ax | grep 'emc-remote' | grep -v grep | awk '{print $1}'` 2>/dev/null
    kill -SIGTERM `ps ax | grep 'emc-harvester' | grep -v grep | awk '{print $1}'` 2>/dev/null
    
    echo -n 'Awaiting EMC service shutdown...'
    secondsPassed=0
    while [ $secondsPassed -lt $maxWaitTime ]; do
    	psOutput=`ps ax`
    	echo $psOutput | grep ".*$remote" >/dev/null
    	remotePresent=$?
    	echo $psOutput | grep ".*$harvester" >/dev/null
    	harvesterPresent=$?
    	if [ $remotePresent -eq 1 -a $harvesterPresent -eq 1 ]; then
    		break
    	fi
    	let ++secondsPassed
    	sleep 1
    	echo -n '.'
    done
    echo -e "\n"
    reboot
    

    Das Skript an sich funktioniert so weit. Nun kann es allerdings vorkommen, dass der Impuls zum Neustart von einem der zu beendenden Programme aus kommt. Effektiv im Programm sähe das dann so aus:

    void ConfigBasedRemoteServer::restartSystem() const {
        ::system("emc-reboot &");
    }
    

    Nun ist es in diesem Fall aber so, dass der aufrufende Prozess stets bis zur maximalen Wartezeit hängen bleibt. Deswegen habe ich das '&' angehängt, um dafür zu sorgen, dass der Prozess nicht auf die Beendigung des Kommandos wartet. Das ist soweit in Ordnung, die Methode läuft sofort durch, aber beendet wird der Prozess durch das SIGTERM-Signal dennoch nicht.

    Liegt das an der Eltern-Kind-Beziehung und wie liesse sich das umgehen?

    Danke für Ideen und Hinweise!
    Beste Grüsse
    Kessi


Log in to reply