@@ -60,6 +60,7 @@ def __init__(
60
60
timeout ,
61
61
stdout_file = "/dev/null" ,
62
62
stderr_file = "/dev/null" ,
63
+ aux_file = None ,
63
64
stderr_on_error_lines = 0 ,
64
65
core_pattern = None ,
65
66
):
@@ -71,8 +72,27 @@ def __init__(
71
72
self .killed = False
72
73
self .__core_pattern = core_pattern
73
74
self .logger = logger .getChild (self .__class__ .__name__ )
74
- self .__stdout_file = open (stdout_file , mode = 'wb' )
75
- self .__stderr_file = open (stderr_file , mode = 'wb' )
75
+ self .__stdout_file_name = stdout_file
76
+ self .__stderr_file_name = stderr_file
77
+ self .__aux_file_name = aux_file
78
+ self .__stdout_file = None
79
+ self .__stderr_file = None
80
+ self .__aux_file = None
81
+
82
+ def __open_output_files (self ):
83
+ self .__stdout_file = open (self .__stdout_file_name , mode = 'w+b' )
84
+ self .__stderr_file = open (self .__stderr_file_name , mode = 'w+b' )
85
+ if self .__aux_file_name is not None :
86
+ self .__aux_file = open (self .__aux_file_name , mode = 'w+b' )
87
+
88
+ def __close_output_files (self ):
89
+ self .__stdout_file .close ()
90
+ self .__stdout_file = None
91
+ self .__stderr_file .close ()
92
+ self .__stderr_file = None
93
+ if self .__aux_file_name is not None :
94
+ self .__aux_file .close ()
95
+ self .__aux_file = None
76
96
77
97
@property
78
98
def daemon (self ):
@@ -81,14 +101,14 @@ def daemon(self):
81
101
@property
82
102
def stdout_file_name (self ):
83
103
if self .__stdout_file is not sys .stdout :
84
- return os .path .abspath (self .__stdout_file . name )
104
+ return os .path .abspath (self .__stdout_file_name )
85
105
else :
86
106
return None
87
107
88
108
@property
89
109
def stderr_file_name (self ):
90
110
if self .__stderr_file is not sys .stderr :
91
- return os .path .abspath (self .__stderr_file . name )
111
+ return os .path .abspath (self .__stderr_file_name )
92
112
else :
93
113
return None
94
114
@@ -98,20 +118,21 @@ def is_alive(self):
98
118
def start (self ):
99
119
if self .is_alive ():
100
120
return
101
- stderr_stream = self .__stderr_file
121
+ self .__open_output_files ()
102
122
self .__daemon = process .execute (
103
123
self .__command ,
104
124
check_exit_code = False ,
105
125
cwd = self .__cwd ,
106
126
stdout = self .__stdout_file ,
107
- stderr = stderr_stream ,
127
+ stderr = self . __stderr_file ,
108
128
wait = False ,
109
129
core_pattern = self .__core_pattern ,
110
130
)
111
131
wait_for (self .is_alive , self .__timeout )
112
132
113
133
if not self .is_alive ():
114
134
self .__check_before_fail ()
135
+ self .__close_output_files ()
115
136
raise DaemonError (
116
137
"Unexpectedly finished on start" ,
117
138
exit_code = self .__daemon .exit_code ,
@@ -141,6 +162,7 @@ def __check_can_launch_stop(self, stop_type):
141
162
142
163
if not self .is_alive ():
143
164
self .__check_before_fail ()
165
+ self .__close_output_files ()
144
166
raise DaemonError (
145
167
"Unexpectedly finished before %s" % stop_type ,
146
168
exit_code = self .__daemon .exit_code ,
@@ -176,6 +198,7 @@ def stop(self):
176
198
wait_for (lambda : not self .is_alive (), self .__timeout )
177
199
is_killed = True
178
200
self .__check_before_end_stop ("stop" )
201
+ self .__close_output_files ()
179
202
180
203
if not is_killed :
181
204
exit_code = self .__daemon .exit_code
@@ -201,6 +224,7 @@ def kill(self):
201
224
self .killed = True
202
225
203
226
self .__check_before_end_stop ("kill" )
227
+ self .__close_output_files ()
204
228
205
229
206
230
@six .add_metaclass (abc .ABCMeta )
0 commit comments