スクリプト全体に適切なコードを散りばめたロガーを設定している場合は、信号を使用してデバッグ出力を自由にオンまたはオフにすることができます。
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
分岐と SIGCLD トラップは、例を 1 つのファイルに収めるためのものです。どのプロセスも別のプロセスにシグナルを送ることができます。
fork ブロック内のコードはスクリプトです。このスクリプトは、デフォルトのログ レベルが INFO のロガーと、ロガーの DEBUG レベルと INFO レベルを切り替える SIGUSR1 シグナルのハンドラーをセットアップします。
fork ブロックの外側のものは、シグナルを別のプロセスに送信する例にすぎません。ENTER を押すと、シグナルが送信され、他のプロセスのログ レベルが変更されます。
これは POSIX システムで動作しますが、Windows についてはわかりません。