1
1
require "spring/boot"
2
2
require "set"
3
+ require "pty"
3
4
4
5
module Spring
5
6
class Application
@@ -108,6 +109,10 @@ def preload
108
109
end
109
110
end
110
111
112
+ def eager_preload
113
+ with_pty { preload }
114
+ end
115
+
111
116
def run
112
117
state :running
113
118
manager . puts
@@ -128,7 +133,7 @@ def serve(client)
128
133
manager . puts
129
134
130
135
stdout , stderr , stdin = streams = 3 . times . map { client . recv_io }
131
- [ STDOUT , STDERR ] . zip ( [ stdout , stderr ] ) . each { |a , b | a . reopen ( b ) }
136
+ [ STDOUT , STDERR , STDIN ] . zip ( streams ) . each { |a , b | a . reopen ( b ) }
132
137
133
138
preload unless preloaded?
134
139
@@ -144,8 +149,6 @@ def serve(client)
144
149
end
145
150
146
151
pid = fork {
147
- Process . setsid
148
- STDIN . reopen ( stdin )
149
152
IGNORE_SIGNALS . each { |sig | trap ( sig , "DEFAULT" ) }
150
153
trap ( "TERM" , "DEFAULT" )
151
154
@@ -172,7 +175,7 @@ def serve(client)
172
175
}
173
176
174
177
disconnect_database
175
- [ STDOUT , STDERR ] . each { | stream | stream . reopen ( spring_env . log_file ) }
178
+ reset_streams
176
179
177
180
log "forked #{ pid } "
178
181
manager . puts pid
@@ -273,5 +276,18 @@ def print_exception(stream, error)
273
276
stream . puts ( "#{ first } : #{ error } (#{ error . class } )" )
274
277
rest . each { |line | stream . puts ( "\t from #{ line } " ) }
275
278
end
279
+
280
+ def with_pty
281
+ PTY . open do |master , slave |
282
+ [ STDOUT , STDERR , STDIN ] . each { |s | s . reopen slave }
283
+ yield
284
+ reset_streams
285
+ end
286
+ end
287
+
288
+ def reset_streams
289
+ [ STDOUT , STDERR ] . each { |stream | stream . reopen ( spring_env . log_file ) }
290
+ STDIN . reopen ( "/dev/null" )
291
+ end
276
292
end
277
293
end
0 commit comments