Как отмечает @Victor Moroz, отдельный процесс не может получить ^ C от вашей клавиатуры. Если ваш передний план все еще выполняется, выполняя другую работу, он может запомнить отсоединенный pid и отправить ему сигнал уничтожения при получении SIGINT. Пример:
#!/usr/bin/env ruby
got_sigint = false
backupCommand = "/usr/bin/env sleep 5"
pid = spawn backupCommand
Process.detach(pid)
puts "detached #{pid}"
Kernel.trap('INT') {
got_sigint = true
}
until got_sigint
system "ps -p #{pid}"
sleep 1
end
if got_sigint
begin Process.kill('KILL',pid) rescue Errno::ESRCH end
sleep 1
system "ps -p #{pid}"
end
Если я запустлю это и подожду> 5 секунд, вы увидите, что порожденный процесс завершается естественным образом:
detached 8565
PID TTY TIME CMD
8565 pts/1 00:00:00 sleep
PID TTY TIME CMD
8565 pts/1 00:00:00 sleep
PID TTY TIME CMD
8565 pts/1 00:00:00 sleep
PID TTY TIME CMD
8565 pts/1 00:00:00 sleep
PID TTY TIME CMD
8565 pts/1 00:00:00 sleep
PID TTY TIME CMD
PID TTY TIME CMD
^C PID TTY TIME CMD
Если я запускаю снова и отправляю ^ C раньше, чем через 5 секунд, процесс на переднем плане улавливает сигнал и убивает фон:
detached 8588
PID TTY TIME CMD
8588 pts/1 00:00:00 sleep
PID TTY TIME CMD
8588 pts/1 00:00:00 sleep
^C PID TTY TIME CMD