我想写一个脚本,它能做两件事:(1)启动一个代理,(2)运行一个带有pry
和自定义提示符的rails控制台
问题是我不知道如何防止Ctrl+C
中断到达代理进程。
以下是我尝试过的:
- 在执行的几个不同部分捕获
INT
和TERM
信号 - 使用proxy命令生成一个bash脚本并运行
- 运行一个单独的脚本来运行代理作业和控制台/窥探代码
到目前为止没有任何工作。
如果您有任何建议,我们将不胜感激。
这里有一个测试脚本来试用它。以下是你需要的:
pry
已安装rails
应用程序根文件夹中的脚本- 在其上运行
chmod +x
,使其可执行
#!/usr/bin/env ruby
class TestInterrupt
include Process
include Signal
def start
override_interrupt
start_script
start_console
exit
end
private
attr_reader :bash_job, :console_job
def override_interrupt
trap("INT") { puts "global INT. Run `!!!`, `quit`, or `exit` to terminate" }
trap("TERM") { puts "global TERM. Run `!!!`, `quit`, or `exit` to terminate" }
puts "=== Trapping global INT, TERM ==="
end
def start_script
@bash_job = fork do
trap("INT") { puts "bash_job INT" }
trap("TERM") { puts "bash_job TERM" }
puts "=== Trapping bash_job INT, TERM ==="
exec("echo Starting shell script && sleep 5 && echo Ending shell script")
end
Process.detach(@bash_job)
end
def start_console
@console_job = fork do
trap("INT") { puts "console_job INT" }
trap("TERM") { puts "console_job TERM" }
puts "=== Trapping console INT, TERM ==="
exec console_code
end
puts "=== Starting rails console (PID: console_job) ==="
wait(console_job)
end
def console_code
<<~BASH
rails runner '#{pry_code}'
BASH
end
def pry_code
<<~RUBY
require "pry"
pry_prompt = Pry.config.prompt
env_prompt = Pry::Helpers::Text.cyan("TestInterrupt")
Pry.config.prompt = [
proc { |*a| "\#{env_prompt} \#{pry_prompt.first.call(*a)}" },
proc { |*a| "\#{env_prompt} \#{pry_prompt.second.call(*a)}" },
]
Signal.trap("INT") { puts "inner INT" }
Signal.trap("TERM") { puts "inner TERM" }
puts "=== Trapping inner INT, TERM ==="
pry
RUBY
end
end
TestInterrupt.new.start
1条答案
按热度按时间cpjpxq1n1#
我知道
INT
是CTRL-C,CTRL-D不是信号,所以我只能调试一下:工作,不退出。
不管用
有效但不退出。眼见为实
watch -n 1 ps ft pts/4
:forks和execs以及rails console也是一样:
其中一个没能挺过来