Last active
November 17, 2018 04:56
-
-
Save JoshCheek/c34d54e87fc771d2972e50c9900cfaeb to your computer and use it in GitHub Desktop.
Spring background process solution (https://github.com/pry/pry/issues/1290#issuecomment-56624349 and https://github.com/rails/spring/pull/514)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'socket' | |
FORWARDED_SIGNALS = %w(INT QUIT USR1 USR2 INFO WINCH) & Signal.list.keys | |
receiver = UNIXSocket.new('whatevz.sock') | |
pid = receiver.gets.to_i | |
receiver.send_io $stdin | |
receiver.send_io $stdout | |
$stdin.close | |
$stdout.close | |
FORWARDED_SIGNALS.each do |signal| | |
trap(signal) { Process.kill signal, pid } | |
end | |
# fg/bg applies to both the server and ourselves | |
orig_tstp_handler = orig_cont_handler = nil | |
tstp_handler = lambda do |*| | |
Process.kill 'TSTP', pid | |
trap 'TSTP', orig_tstp_handler | |
Process.kill 'TSTP', Process.pid | |
end | |
cont_handler = lambda do |*| | |
trap 'CONT', orig_cont_handler | |
Process.kill 'CONT', Process.pid | |
trap 'CONT', cont_handler | |
Process.kill 'CONT', pid | |
trap 'TSTP', tstp_handler | |
end | |
orig_tstp_handler = trap 'TSTP', tstp_handler | |
orig_cont_handler = trap 'CONT', cont_handler | |
loop do | |
break if receiver.closed? | |
break if IO.select [receiver], [], [], 1 | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'socket' | |
# This sockets listens for local connections. | |
name = 'whatevz.sock' | |
File.delete name if File.exist? name | |
at_exit { File.delete name if File.exist? name } | |
listener = UNIXServer.new name | |
at_exit { listener.close unless listener.closed? } | |
client = listener.accept | |
at_exit { client.close unless client.closed? } | |
at_exit { client.puts "fin" unless client.closed? } | |
client.puts Process.pid | |
def log(type, message) | |
puts "#{type}: #{message.inspect}" | |
end | |
read = client.recv_io | |
log :reader, read | |
write = client.recv_io | |
log :writer, write | |
loop do | |
message = read.gets | |
log :message, message | |
write.puts message | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment