Salome HOME
Bug IPAL19893 4.x: debug information is in terminal.
[modules/kernel.git] / bin / server.py
1 #!/usr/bin/env python
2
3 import os, sys, string
4 process_id = {}
5
6 # -----------------------------------------------------------------------------
7 #
8 # Definition des classes d'objets pour le lancement des Server CORBA
9 #
10
11 class Server:
12     """Generic class for CORBA server launch"""
13
14     def initArgs(self):
15         self.PID=None
16         self.CMD=[]
17         self.ARGS=[]
18         if self.args.get('xterm'):
19             self.ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
20
21     def __init__(self,args):
22         self.args=args
23         self.initArgs()
24
25
26     def run(self):
27         global process_id
28         myargs=self.ARGS
29         if self.args.get('xterm'):
30             # (Debian) send LD_LIBRARY_PATH to children shells (xterm)
31             env_ld_library_path=['env', 'LD_LIBRARY_PATH='
32                                  + os.getenv("LD_LIBRARY_PATH")]
33             myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path
34         command = myargs + self.CMD
35         #print "command = ", command
36         if sys.platform == "win32":
37           import win32pm
38           #cmd_str = "\"" + string.join(command, " ") + "\""
39           #print cmd_str
40           #pid = win32pm.spawnpid( cmd_str )
41           pid = win32pm.spawnpid( string.join(command, " "), '-nc' )
42           #pid = win32pm.spawnpid( string.join(command, " ") )
43         else:
44           #pid = os.spawnvp(os.P_NOWAIT, command[0], command)
45           pid=self.daemonize(command)
46         process_id[pid]=self.CMD
47         self.PID = pid
48         return pid
49
50     def daemonize(self,args):
51         # to daemonize a process need to do the UNIX double-fork magic
52         # see Stevens, "Advanced Programming in the UNIX Environment" for details (ISBN 0201563177)
53         # and UNIX Programming FAQ 1.7 How do I get my program to act like a daemon?
54         #     http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
55         #open a pipe
56         c2pread, c2pwrite = os.pipe()
57         #do first fork
58         pid=os.fork()
59         if pid > 0:
60           #first parent
61           os.close(c2pwrite)
62           #receive real pid from child
63           data=os.read(c2pread,24) #read 24 bytes
64           os.waitpid(pid,0) #remove zombie
65           os.close(c2pread)
66           # return : first parent
67           return int(data)
68
69         #first child
70         # decouple from parent environment
71         os.setsid()
72         os.close(c2pread)
73
74         # do second fork : second child not a session leader
75         try:
76           pid = os.fork()
77           if pid > 0:
78             #send real pid to parent
79             os.write(c2pwrite,"%d" % pid)
80             os.close(c2pwrite)
81             # exit from second parent
82             os._exit(0)
83         except OSError, e:
84           print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
85           os.write(c2pwrite,"-1")
86           os.close(c2pwrite)
87           sys.exit(1)
88
89         #I am a daemon
90         os.close(0) #close stdin
91         os.open("/dev/null", os.O_RDWR)  # redirect standard input (0) to /dev/null
92         try:
93           os.execvp(args[0], args)
94         except OSError, e:
95           print >>sys.stderr, "(%s) launch failed: %d (%s)" % (args[0],e.errno, e.strerror)
96           os._exit(127)