gpt4 book ai didi

ruby - 在 ruby​​ 中运行脚本时等待击键

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:19 25 4
gpt4 key购买 nike

有没有办法运行 ruby​​ 脚本并在脚本中执行命令时仍然响应击键?

我想运行一个 ruby​​ 脚本,但能够按“空格键”并暂停脚本(在当前运行的命令执行后),然后再次按“空格键”并恢复脚本。

我唯一的想法(我敢肯定这是一个奇怪的想法)是打开一个新线程并在那里等待击键,然后当我击键时,设置一个停止标志。只是现在看来我需要在每个命令后检查此标志以了解何时停止。

最佳答案

如果您设置了记录器并在整个脚本中散布了适当的代码,则可以使用信号随意打开和关闭调试输出:

 pid = fork do

# set up a logger
require 'logger'
log = Logger.new(STDOUT)
log.level = Logger::INFO

# toggle between INFO and DEBUG log levels on SIGUSR1
trap(:SIGUSR1) do
if log.level == Logger::DEBUG
log.level = Logger::INFO
else
log.level = Logger::DEBUG
end
end

# Main loop - increment a counter and occasionally print progress
# as INFO level. DEBUG level prints progress at every iteration.
counter = 0
loop do
counter += 1
exit if counter > 100
log.debug "Counter is #{counter}"
log.info "Counter is #{counter}" if counter % 10 == 0
sleep 0.1
end

end

# This makes sure that the signal sender process exits when the
# child process exits - only needed here to make the example
# terminate nicely.
trap(:SIGCLD) do
exit(0) if Process.wait(-1, Process::WNOHANG) == pid
end

# This is an example of sending a signal to another process.
# Any process may signal another by pid.
# This example uses a forking parent-child model because this
# approach conveniently yields the child pid to the parent.
loop do
puts "Press ENTER to send SIGUSR1 to child"
STDIN.gets
Process.kill :SIGUSR1, pid
end

fork 和SIGCLD陷阱是为了让例子适合一个文件;任何进程都可以向另一个进程发送信号。

fork block 中的代码是您的脚本。该脚本设置了一个默认日志级别为 INFO 的记录器,以及一个用于在 DEBUG 和 INFO 级别之间切换记录器的 SIGUSR1 信号的处理程序。

fork block 之外的内容只是向另一个进程发送信号的示例。按 ENTER 将发送信号并更改其他进程的日志记录级别。

这适用于 POSIX 系统,我对 Windows 不了解。

关于ruby - 在 ruby​​ 中运行脚本时等待击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14598183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com