Остановить скрипт в разветвленном процессе - PullRequest
1 голос
/ 28 марта 2012

У меня есть

backupCommand = "rsync #{rsyncOptions} #{directory} #{backupSSH}:#{@backupPath}"
pid = fork {   
  system backupCommand
  Kernel.trap('INT') {
    Kernel.exit
  }   
}   
Process.detach(pid)

Что я хочу сделать, так это то, что если скрипт запускается и я хочу его остановить, ctrl-c должен уничтожить скрипт и все его процессы разветвлены.

1 Ответ

0 голосов
/ 30 марта 2012

Как отмечает @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...