Не могу остановить WEBrick 1.3.1 с помощью Ctrl-C в Ubuntu 11.04

Я использую RVM, Ruby 1.9.2 и Rails 3.0.7.

Стандартное уничтожение процесса с другого терминала тоже не работает, но kill -9, конечно, работает.

Я нашел аналогичный вопрос, CTRL+C для сервера Webbrick игнорируется, но неясно, описывает ли этот вопрос ту же основную проблему. . Кроме того, разрешение не применяется, так как я не использую :git в своем Gemfile.

обновление 1: (устарело... см. обновление 2 ниже, чтобы узнать больше)

Мне удалось сузить проблему до одного драгоценного камня. Если вы используете следующий тестовый скрипт, вы также можете увидеть проблему (при условии, что вы используете Ubuntu 11.04... в 10.04 проблем не было)

rm -rf tmpkilltest

rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm 1.9.2@tmpkilltest

gem install rails -v=3.0.7 --no-rdoc --no-ri
gem install sqlite3 -v=1.3.3 --no-rdoc --no-ri

rails new tmpkilltest

cd tmpkilltest

echo "gem 'barista', '1.0'" >> Gemfile

bundle

rails s

Тот факт, что проблема вызвана взаимодействием Rails с драгоценным камнем, наводит меня на мысль, что этот вопрос на самом деле имеет отношение к CTRL+C на сервер Webbrick игнорируется, хотя тестовый пример выше показывает, что это явно не вызвано использованием :git для драгоценного камня.

обновление 2:

В обновлении 1 я упомянул, что сузил его до жемчужины. Изучив этот драгоценный камень, я в конце концов нашел настоящего виновника. Драгоценный камень делал единственный системный вызов. Я сделал очень небольшую модификацию тестового сценария, в которой я больше не загружаю гем бариста, а просто добавляю один системный вызов в конец application.rb. С этим системным вызовом ctrl-c не работает. Удалите системный вызов, и он действительно работает.

rm -rf tmpkilltest

rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm 1.9.2@tmpkilltest

gem install rails -v=3.0.7 --no-rdoc --no-ri
gem install sqlite3 -v=1.3.3 --no-rdoc --no-ri

rails new tmpkilltest

cd tmpkilltest

bundle

echo "\`date\`" >> config/application.rb

rails s

Это может объяснить кажущееся сходство между этим вопросом и CTRL+C для игнорирования сервера Webbrick. Я подозреваю, что драгоценный камень, о котором они упоминают, также выполняет системный вызов.


person Gordon McCreight    schedule 05.05.2011    source источник
comment
У меня точно такая же проблема с ruby ​​1.9.2 и ubuntu 11.04, это очень раздражает. Пожалуйста, держите меня в курсе возможных решений :)   -  person gucki    schedule 09.05.2011
comment
rails.lighthouseapp.com/projects/8994/tickets/   -  person gucki    schedule 09.05.2011
comment
redmine.ruby-lang.org/issues/4608   -  person gucki    schedule 09.05.2011
comment
Не могли бы вы принять ответ? Это не обязательно должно быть моим, но было бы неплохо :-P   -  person Jamie Penney    schedule 11.05.2011
comment
Это хороший вопрос, и на него я не знаю ответа. Обычно я принимаю обходной путь в качестве ответа, если нет фактического решения. Я предполагаю, что часть полезности SO заключается в том, чтобы упростить решение проблем через Google, поэтому для большинства людей, которые на самом деле не работают с Webrick, обходной путь, вероятно, подойдет. Что-то большее, чем это, вероятно, относится к системе отслеживания ошибок Webrick (или к тому, что является проблемным компонентом).   -  person Jamie Penney    schedule 16.05.2011
comment
Мне нравится решение @StrangeElement. Ctrl + C, Ctrl + Z, затем fg. Было бы здорово, если бы было найдено реальное решение, но пока я собираюсь принять это как обходной путь.   -  person Tass    schedule 24.05.2011
comment
Справедливо, Джейми. Реального ответа, похоже, не ожидается, поэтому я выберу ваш, так как это обходной путь, который я использовал. Тем не менее, я изменю принятый ответ, если кто-то согласится с реальной сделкой.   -  person Gordon McCreight    schedule 05.06.2011
comment
Еще один билет Ruby red mine, bugs.ruby-lang.org/issues/4777, говорит, что это ошибка ядра (Linux). Они дают обходной путь (по сути, эквивалентный Ctrl-C/Ctrl-Z, для использования, если вы демонизировали сервер: kill -INT $(‹tmp/pids/server.pid); kill -CONT $(‹ tmp/pids/server.pid)   -  person jackr    schedule 12.06.2012
comment
Если вам нужно ядерное оружие с орбиты, оно выглядит примерно так... killall -9 ruby. Отказ от ответственности: возможны неожиданные результаты закрытия других процессов.   -  person AJFaraday    schedule 29.11.2017


Ответы (13)


Я бы предпочел прокомментировать, чем добавить ответ на этот вопрос, но недостаточно представителей.

У меня та же проблема, и я обнаружил, что возобновление (с помощью fg) после ввода ctrl-c, а затем приостановка (с помощью ctrl-z< /kbd>, как предложено выше) делает свое дело.

Итак, рецепт такой:

  1. ctrl-c (сразу ничего не делает)
  2. ctrl-z (приостанавливает WEBrick, возвращает в оболочку)
  3. fg (возобновляет WEBrick, немедленно завершает работу с помощью SIGINT)

    lampadmin@lampadmin-DX4840:/var/www/rails/agences$ r s
    => Booting WEBrick
    => Rails 3.0.5 application starting in development on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    [2011-05-14 14:25:36] INFO  WEBrick 1.3.1
    [2011-05-14 14:25:36] INFO  ruby 1.9.2 (2011-02-18) [x86_64-linux]
    [2011-05-14 14:25:36] INFO  WEBrick::HTTPServer#start: pid=2585 port=3000
    

    ^C^Z (‹-- ctrl-c, затем ctrl-z)

    [1]+  Stopped                 rails s
    lampadmin@lampadmin-DX4840:/var/www/rails/agences$ fg
    rails s
    [2011-05-14 14:25:45] INFO  going to shutdown ...
    [2011-05-14 14:25:45] INFO  WEBrick::HTTPServer#start done.
    Exiting
    
person StrangeElement    schedule 14.05.2011
comment
Хорошая находка. Я бы предпочел сделать это, чем прибегать к kill -9. - person Abe Voelker; 09.06.2011

У меня похожая проблема, я использовал Ctrl+Z, чтобы приостановить задание, затем kill -9 %1, чтобы убить первое приостановленное задание. Окольный способ убить его, но он работает.

См. этот вопрос в Superuser для получения дополнительной информации: https://superuser.com/questions/243460/what-to-do-when-ctrl-c-cant-kill-a-process

person Jamie Penney    schedule 05.05.2011

Я считаю, что ^C не может убить серверы WEBrick, потому что сервер создает новую сессию:

In webrick/server.rb:

  class Daemon
    def Daemon.start
      exit!(0) if fork
      Process::setsid
      exit!(0) if fork
      Dir::chdir("/")
      File::umask(0)
      STDIN.reopen("/dev/null")
      STDOUT.reopen("/dev/null", "w")
      STDERR.reopen("/dev/null", "w")
      yield if block_given?
    end
  end

(Очень похожий код существует в rack/server.rb, поэтому, если вы запускаете WEBrick через стойку, вы можете не указывать параметры командной строки -D или --daemonize.)

И из справочной страницы setsid(2):

   setsid() creates a new session if the calling process is not
   a process group leader.  The calling process is the leader of
   the new session, the process group leader of the new process
   group, and has no controlling tty.

не имеет управляющего tty означает, что сигналы, сгенерированные терминалом (^Z SIGTSTP, ^\ SIGKILL, SIGTTIN, SIGTTOU и т. д.), не могут достичь процесса, даже если он был запущен на этом терминале. Ссылка была разорвана.

person sarnold    schedule 05.05.2011
comment
Я смог убить его в отдельном терминале, но только с помощью -9. На мой взгляд, это означает, что, вероятно, SIGINT доставлялся процессу, когда я нажимал ctrl-c, но процесс игнорировал его (точно так же, как он игнорировал явное уничтожение в другом терминале, пока я не заставил его с помощью - 9) - person Gordon McCreight; 05.05.2011
comment
Я не уверен, что понимаю, что вы говорите. У меня тоже такая же проблема, ctrl + c раньше хорошо работал в 10.04, а теперь я обнаружил, что он работает с перебоями в 11.04. - person Tass; 24.05.2011
comment
Если вы посмотрите на webrick.rb, там написано: Чтобы запустить сервер WEBrick в качестве демона, просто запустите WEBrick::Daemon.start. Я нашел код webrick и не вижу, чтобы он запускал демон по умолчанию. Хорошая попытка, но это не относится к обычному случаю. - person Kelvin; 14.11.2012

Хорошо, проблема для меня решена. Недавнее обновление ядра, которое я применил как часть стандартных обновлений Ubuntu, устранило проблему.

Кроме того, вот хорошее обсуждение проблемы, в котором объясняется, что основной причиной была регрессия ядра, появившаяся в 2.6.38 ( http://redmine.ruby-lang.org/issues/4777 )

Регрессия была исправлена, и похоже, что исправление недавно было включено в обновления Ubuntu, поэтому, если вы столкнулись с этой проблемой, вам следует установить последние обновления.

person Gordon McCreight    schedule 20.07.2011

Это также происходит для меня в Mac OS X.

Удивительно, но ни Rack, ни WEBrick не настраивают пользовательские обработчики сигналов. Я поместил это в метод call моего приложения для стойки, и он сообщает мне, что текущий обработчик DEFAULT для SIGINT (возвращает строку "DEFAULT"):

p Signal.trap('INT', 'DEFAULT')

Я подозреваю, что в select рубина происходит что-то, что перехватывает сигналы.

Вот 2 способа остановить его на сервере:

1) Нажмите ctrl-z для приостановки. Затем kill -ABRT pid_or_job_id. Я не знаю, насколько "чисто" завершается процесс. Это раздражает, но вам не нужно добавлять код.

2a) Если вы используете Rack, добавьте это прямо перед вызовом Rack::Handler::WEBrick.run:

Signal.trap('INT') {
  Rack::Handler::WEBrick.shutdown
}

2b) Если вы используете ванильный WEBrick:

Signal.trap('INT') { server.shutdown }

где server — ваш объект сервера WEBrick.

Это хорошо, если вы собираетесь часто использовать SIGINT. Вы также можете добавить обработчики для TERM и HUP.

person Kelvin    schedule 13.11.2012

использовал эту строку для создания ярлыка с помощью ccsm (менеджер настроек compiz conig или что-то в этом роде) -> команды:

kill -9 `pgrep -fl 'script/rails s' | awk '{print $1}'`

установите (ctrl+shift+`) или что угодно

person closedmind    schedule 05.07.2011

У меня была такая же проблема при обновлении моего Ubuntu. Невозможно нормально выйти из вебрика с помощью Ctrl+C, пришлось использовать kill -9...

person Nicolas Blanco    schedule 24.05.2011

Я сам столкнулся с этой проблемой. Я использую rvm rails 3.0.9 и Ubuntu 11.04 32bit под управлением Unity. Я обнаружил, что терминатор передает рельсам Ctrl+c.

person alley    schedule 17.06.2011

Кажется, это проблема с Unity и Terminal, по какой-то причине ^c обрабатывается неправильно. попробуйте сделать то же самое, используя terminator (более удобный терминал). Или просто используйте гном.

По крайней мере, я так решил проблему. Я предлагаю перенести это на askubuntu.com.

В U10.04 у меня была эта проблема с запуском webrick, mongrel, console, sqlite, не имело значения, что я запускал на самом деле.

person Dmitriy Likhten    schedule 24.05.2011
comment
Я только что вошел в систему, используя классический Ubuntu без эффектов (gnome без Unity) и запустил тестовый сценарий, указанный в обновлении 2, как в обычном терминале, так и в терминаторе. Он продолжал демонстрировать такое же плохое поведение. Обратите внимание, что обычное уничтожение (без -9) также не работает, поэтому дело не в том, что сигнал не передается из-за плохого взаимодействия между компонентами графического интерфейса. Кроме того, ctrl-c отлично работает, если не выполняется системный вызов. (см. обновление 2) - person Gordon McCreight; 25.05.2011
comment
Если вам НЕ НУЖЕН webrick, почему бы просто не установить mongrel gem install mongrel или не поместить его в зависимость от упаковщика и больше никогда об этом не беспокоиться. - person Dmitriy Likhten; 25.05.2011
comment
Это на самом деле отличная идея, но я только что проверил, и проблема не исчезает при использовании mongrel. - person Gordon McCreight; 25.05.2011
comment
@ Гордон, ты пробовал другие терминальные программы? Что-то не так со стандартным. - person Dmitriy Likhten; 25.05.2011
comment
Терминатор демонстрирует ту же проблему для меня. Учитывая, что доставка SIGINT через kill тоже не работает, я очень сомневаюсь, что альтернативный терминал решит проблему для кого-либо. - person Bryan Larsen; 30.06.2011

Мой последний ответ был удален, не знаю почему, но я попробую еще раз, потому что я действительно думаю, что это очень связано с проблемой.

В моем Gemfile есть только один гем, который использует аргумент :git.

gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'

У меня та же проблема, что и у всех вас, Ctrl+C игнорируется; но если я удалю эту зависимость от драгоценного камня (и я удалю соответствующий инициализатор), проблема исчезнет, ​​и я могу использовать Ctrl + C, как и раньше.

Я мог подумать, что это ошибка, связанная с драгоценным камнем rails_admin, но, как я прочитал в этом другом вопросе: CTRL+ Сервер C to Webbrick игнорируется, скорее всего, это связано с любым гемом, в котором используется параметр :git...

Надеюсь, это полезно.

person diegopau    schedule 04.07.2011

Нашел какое-то решение. Запустите в терминале:

stty -echoctl

И тогда будет работать Ctrl-C. http://linux.m2osw.com/remove-ctrl-C-from-being-printed-in-console

Сработал всего за один сеанс. Опубликовано лучшее решение рядом.

person closedmind    schedule 05.07.2011

Интересный опыт (и хороший обходной путь на следующие недели):

Если вы находитесь под Ubuntu и используете Guake для быстрого доступа к терминалу, вы можете запустить

rails s

там. Ctrl + C воспроизводимо работает там у меня и останавливает сервер.

Надеюсь, я смог помочь! :)

РЕДАКТИРОВАТЬ: Поскольку очевидно, что это не воспроизводимо для всех, вот моя установка: Ubuntu 11.04, 32-разрядная версия, Guake 0.4.2-4ubuntu1

person Dorian    schedule 02.06.2011
comment
Спасибо за ответ, Дориан. Guake, похоже, не влияет на мою настройку (и я уверен, что это не проблема эмулятора терминала, поскольку вы не можете убить процесс из других мест, кроме как с -9). Тем не менее, я весело провел время, играя с Гуаке... классный термин! - person Gordon McCreight; 03.06.2011
comment
Привет, Гордон, жаль, мне интересно, в чем может быть разница между нашими системами? - person Dorian; 06.06.2011

Если ctr+c не работает, то прежде чем приступать к реализации упомянутых методов, просто посмотрите настройки вашего терминала. Иногда может случиться так, что мы изменим сочетания клавиш терминала для нашего удобства. И мы назначаем ctr+c для копирования содержимого терминала. В этом случае ctr+c не будет работать для остановки сервера, вместо этого он будет использоваться для копирования.

Если настройки не изменились, попробуйте использовать другой порт, например 4000.

person Ruturaj Bisure    schedule 04.01.2017