Как прерывать бесперебойную программу?

Если я запустил mysqld из командной строки, он отобразит несколько сообщений о запуске и перестанет отвечать на запросы. Он не производит вывод и игнорирует любой вход, и, похоже, нет способа избавиться от него. ctrl + z и ctrl + c ничего не делают, нет способа вернуться к терминалу – мне нужно начать новый сеанс. Это означает, например, если я подключаюсь к серверу через ssh, мне нужно инициировать новое ssh-соединение.

Это очень раздражает. Есть ли способ в bash сказать, чтобы деактивировать текущий процесс? Любая другая программа, которую я могу приостановить с помощью ctrl + z, но не mysqld, хотя я не знаю почему. Если я запустил его с помощью mysqld & затем он запустится в фоновом режиме, и я могу нормально посылать ему сигналы, если я не fg , набрав fg , и он действует как обычный процесс, поэтому я не знайте, почему ctrl + z не влияет на него, так как я думал, что это часть bash, а не находится под контролем процесса.

Итак: Есть ли альтернатива ctrl + z, потому что, когда ctrl + z не работает?

    Ctrl + Z – фактически функция универсального терминального интерфейса в ядре, а не bash. Это приводит к отправке сигнала SIGTSTP в процесс переднего плана. Аналогично, Ctrl + C отправляет SIGTERM и Ctrl + \ отправляет SIGQUIT.

    Существует два способа, с помощью которых программа может заставить Ctrl + Z потерять свой эффект.

    • Программа может игнорировать сигнал SIGTSTP.
      Вы можете проверить поведение сигнала процесса с помощью отладчика. В Linux информация доступна через /proc : grep Sig /proc/1234/status где 1234 – это идентификатор процесса, который показывает, какие сигналы игнорируются ( SigIgn , они просто отключаются безвредно) или заблокированы ( SigBlk , они помещены в ожидании, пока программа не включит их). Номер является битовой маской и выписан в шестнадцатеричном формате. SIGTSTP – это сигнал 20 (запустить kill -l в bash), поэтому он игнорируется, если на линии SigIgn пятая цифра справа равна 8 или выше.
    • Программа может изменять привязки клавиш.
      Вы можете проверить текущие привязки клавиш в командной строке, например stty -a </dev/pts/42 где /dev/pts/42 – это терминал, на котором выполняется процесс. Найдите susp = ^Z

    Демон может игнорировать большинство сигналов. Запустите его в фоновом режиме, если он не развивает сам по себе (большинство демонов на самом деле разворачивают ребенка, как только они начинаются, и немедленно дают родителям). Если вы запустили его на переднем плане, есть много способов восстановить (отправить его или его родительскую оболочку на сигнал), но для этого вам понадобится другая оболочка.

    Команда stty -a покажет вам все сочетания клавиш в вашем текущем терминале. Как правило, в Unix-подобных системах единственными отображаемыми сигналами являются Ctrl + C (SIGINT), Ctrl + \ (SIGQUIT) и Ctrl + Z (SIGTSTP). Других привязок к другим сигналам нет, поэтому нет других сигналов, которые вы можете отправить в своем текущем сеансе с помощью клавиатуры.

    Вообще говоря, окончательный d в имени программы обычно указывает «демон». Демоны предназначены для работы в фоновом режиме и работают через другие средства, выходящие за пределы stdin / out (например, трубы, сигналы, разъемы …). Это означает, что может возникнуть непредвиденное поведение, когда сама программа не работает в фоновом режиме (например, терминал, похоже, «зависает», потому что демон сделал что-то для ввода, вывода или что-то делает / ждет в петля)

    Также, как правило, может быть также, что у демона есть ловушки для определенных сигналов и обрабатываются по-разному (или даже игнорируются). Вы пытались отправить SIGINT ( kill -2 , эквивалентный Ctrl + C ), SIGQUIT ( kill -3 , эквивалентный Ctrl + \ ) или SIGTSTP ( kill -20 , эквивалентный Ctrl + Z ) при запуске mysqld в фоновом режиме, только для целей тестирования?

    EDIT: для изменения stty сопоставлений вам нужно написать:

     stty <action> <new-mapping> 

    Например, чтобы переназначить SIGINT в Ctrl + X

     stty intr ^x 

    Обратите внимание, что этот параметр действителен только в текущем терминале во время текущего сеанса.