Подтвердить что ты не робот

Не удается остановить 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.

update 1: (старый теперь... см. обновление 2, ниже, для реального совка)

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

rm -rf tmpkilltest

rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm [email protected]

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 Я упомянул, что сузил его до драгоценного камня. Когда я прошел через этот камень, я в конце концов нашел настоящего преступника. Драгоценный камень делал единый системный вызов. Я сделал очень незначительную модификацию теста script, где я больше не загружаю камень бариста, но я просто добавляю один системный вызов в конце application.rb. При этом системном вызове ctrl-c не работает. Удалите системный вызов, и он работает.

rm -rf tmpkilltest

rvm 1.9.2
rvm --force gemset delete tmpkilltest
rvm gemset create tmpkilltest
rvm [email protected]

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, чтобы сервер веб-браузера проигнорировал. Моя догадка заключается в том, что упоминаемый жемчуг также вызывает системный вызов.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

    [email protected]:/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
    [email protected]:/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
    

Ответ 3

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

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

Ответ 4

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

В 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) manpage:

   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 и т.д.) не могут достигнуть процесса, даже если он был запущен на этом терминале. Ссылка была разорвана.

Ответ 5

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

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

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

Я подозреваю, что что-то происходит в ruby ​​ select, который захватывает сигналы.

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

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

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

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

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

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

где server - ваш серверный объект WEBrick.

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

Ответ 6

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

Ответ 7

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

Ответ 8

использовал эту строку для создания ярлыка с ccsm (менеджер настроек conig conig или smth, подобный этому) → команды:

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

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

Ответ 9

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

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

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

Ответ 10

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

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

rails s

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

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

EDIT: Как очевидно, это не воспроизводится для всех, вот моя настройка: Ubuntu 11.04, 32-бит, Guake 0.4.2-4ubuntu1

Ответ 11

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

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

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

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

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

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

Ответ 12

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

stty -echoctl

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

Работал только на один сеанс. Добавлено лучшее решение рядом.

Ответ 13

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

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