X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FkillSalomeWithPort.py;h=725ee246e4549766320fb0989069860ca7f544dc;hb=0e0fd9ed25fa80d505c2dcdddb80a4250b66bafa;hp=6eeceec530b9344775d46f22673a1bf17f4f2b16;hpb=e45d5aee405e8caa5e5a8aaa8e1f9993c98cc171;p=modules%2Fkernel.git diff --git a/bin/killSalomeWithPort.py b/bin/killSalomeWithPort.py index 6eeceec53..725ee246e 100755 --- a/bin/killSalomeWithPort.py +++ b/bin/killSalomeWithPort.py @@ -1,25 +1,25 @@ #! /usr/bin/env python # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE # -# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS # -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. # -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # ## \file killSalomeWithPort.py @@ -32,7 +32,7 @@ # import os, sys, pickle, signal, commands,glob -from launchConfigureParser import verbose +from salome_utils import verbose import Utils_Identity import salome_utils @@ -86,7 +86,7 @@ def appliCleanOmniOrbConfig(port): - ${HOME}/${APPLI}/USERS/.omniORB_${USER}_last.cfg the last is removed only if the link points to the first file. """ - from salome_utils import generateFileName + from salome_utils import generateFileName, getUserName home = os.getenv("HOME") appli = os.getenv("APPLI") if appli is None: @@ -121,7 +121,7 @@ def appliCleanOmniOrbConfig(port): #try to relink last.cfg to an existing config file if any files = glob.glob(os.path.join(os.environ["HOME"],Utils_Identity.getapplipath(), - "USERS",".omniORB_"+salome_utils.getUserName()+"_*.cfg")) + "USERS",".omniORB_"+getUserName()+"_*.cfg")) current_config=None current=0 for f in files: @@ -137,6 +137,45 @@ def appliCleanOmniOrbConfig(port): ########## kills all salome processes with the given port ########## +def shutdownMyPort(port): + """ + Shutdown SALOME session running on the specified port. + Parameters: + - port - port number + """ + from salome_utils import generateFileName + + # set OMNIORB_CONFIG variable to the proper file + home = os.getenv("HOME") + appli = os.getenv("APPLI") + kwargs = {} + if appli is not None: + home = os.path.join(home, appli,"USERS") + kwargs["with_username"]=True + pass + omniorb_config = generateFileName(home, prefix="omniORB", + extension="cfg", + hidden=True, + with_hostname=True, + with_port=port, + **kwargs) + os.environ['OMNIORB_CONFIG'] = omniorb_config + + # give the chance to the servers to shutdown properly + try: + import time + import salome_kernel + orb, lcc, naming_service, cm = salome_kernel.salome_kernel_init() + # shutdown all + lcc.shutdownServers() + # give some time to shutdown to complete + time.sleep(1) + # shutdown omniNames and notifd + salome_kernel.LifeCycleCORBA.killOmniNames() + except: + pass + pass + def killMyPort(port): """ Kill SALOME session running on the specified port. @@ -144,6 +183,12 @@ def killMyPort(port): - port - port number """ from salome_utils import getShortHostName, getHostName + + # try to shutdown session nomally + import threading, time + threading.Thread(target=shutdownMyPort, args=(port,)).start() + time.sleep(3) # wait a little, then kill processes (should be done if shutdown procedure hangs up) + # new-style dot-prefixed pidict file filedict = getPiDict(port, hidden=True) # provide compatibility with old-style pidict file (not dot-prefixed) @@ -208,7 +253,7 @@ def killMyPort(port): try: if sys.platform == "win32": import win32pm - win32pm.killpid(int(pid),0) + win32pm.killpid(int(pid),0) else: os.kill(int(pid),signal.SIGKILL) pass @@ -261,8 +306,59 @@ def killNotifdAndClean(port): pass appliCleanOmniOrbConfig(port) - + +def killMyPortSpy(pid, port): + dt = 1.0 + while 1: + if sys.platform == "win32": + from win32pm import killpid + if killpid(int(pid), 0) != 0: + return + else: + from os import kill + try: + kill(int(pid), 0) + except OSError, e: + if e.errno != 3: + return + break + pass + from time import sleep + sleep(dt) + pass + filedict = getPiDict(port, hidden=True) + if not os.path.exists(filedict): + return + try: + import omniORB + orb = omniORB.CORBA.ORB_init(sys.argv, omniORB.CORBA.ORB_ID) + import SALOME_NamingServicePy + ns = SALOME_NamingServicePy.SALOME_NamingServicePy_i(orb) + import SALOME + session = ns.Resolve("/Kernel/Session") + assert session + except: + return + try: + status = session.GetStatSession() + except: + # -- session is in naming service but has crash + status = None + pass + if status: + if not status.activeGUI: + return + pass + killMyPort(port) + return + if __name__ == "__main__": + if sys.argv[1] == "--spy": + pid = sys.argv[2] + port = sys.argv[3] + killMyPortSpy(pid, port) + sys.exit(0) + pass for port in sys.argv[1:]: killMyPort(port) pass