Я не могу использовать комбинацию "Ctrl + C", потому что она посылает сигнал на сеанс.
Ctrl+ Cобычно должен посылать сигнал прерывания . Сигнал прерывания - это сигнал 2. Таким образом, он делает то, что предполагалось.
Killed by signal 2
Это сообщение не то, которое вы обычно видите, но оно совершенно правильно. Процесс завершился, потому что он получил сигнал 2, сигнал прерывания,SIGINT
созданный Ctrl+C
Сначала давайте посмотрим, какая комбинация клавиш соответствует сигналу прерывания
$ stty -a | grep intr intr = ^C
Теперь давайте проверим числовое значение сигнала прерывания.
$ man 7 signal ... Signal Value Action Comment ----------------------------------------------------------------------- SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT 2 Term Interrupt from keyboard SIGQUIT 3 Core Quit from keyboard SIGFPE 8 Core Floating point exception SIGKILL 9 Term Kill signal SIGSEGV 11 Core Invalid memory reference
Обратите внимание, что сигнал KILL - это сигнал 9 (не 2). Вы можете отправить любой из этих сигналов с помощью kill
команды, но только один из них является сигналом KILL, а не сигналом 2.
Таким образом, остается вопрос, что создает это сообщение «Убит по сигналу 2».
Если мы посмотрим на https://stackoverflow.com/questions/3165511/how-to-make-terminal-not-print-killed-by-signal-2-on-catching-a-sigint, то увидим, что это сообщение может быть создано если у вас есть скрипт, который использует trap SIGINT
для перехвата сигналов и выполнения специальной обработки.
Может быть, у вас есть top
псевдоним или top
сценарий раньше, $PATH
чем /usr/bin
?
$ type top top is /usr/bin/top
Вы предлагаете прекратить сеанс SSH с * nix компьютера main
на * nix компьютер client
. Оставляя вас в приглашении оболочки * nix.
Из вашего упоминания о MobaXterm как об альтернативе PuTTY я могу сделать вывод, что вы используете версию PuTTY для Windows, а не версию * nix для PuTTY. Если так, то не понятно, почему ваше SSH-соединение состоит из двух частей (Win-PC -> «main» -> «client»).
Если вы используете PuTTY для входа в main и затем используете ssh
для входа в клиент, не удивительно, что PuTTY ^ C обрабатывается main и не передается клиенту для top
.
Мы можем обратиться к https://unix.stackexchange.com/questions/102061/ctrl-c-handling-in-ssh-session, где обсуждается эта тема.
ssh remotehost
запустит интерактивный сеанс на удаленном хосте. На стороне клиента ssh попытается установить tty, используемый stdin, в режим «raw», а sshd на удаленном хосте выделит псевдо-tty и запустит вашу оболочку как оболочку входа (например, -bash).Установка необработанного режима означает, что символы, которые обычно посылают сигналы (такие как Ctrl-C и Ctrl-), вместо этого просто вставляются во входной поток. ssh отправит такие символы как есть на удаленный хост, где они, вероятно, отправят SIGINT или SIGQUIT и, как правило, уничтожат любую команду и вернут вас в оболочку на удаленном хосте. Соединение ssh останется живым, пока удаленная оболочка жива.
...
ssh remotehost command args ...
запустит неинтерактивный сеанс на удаленном хосте. На стороне клиента ssh не установит tty в необработанный режим (ну, кроме как для чтения в пароле или парольной фразе). Если вы наберете Ctrl-C, ssh получит отправленный SIGINT и будет немедленно прерван, даже не выдав сообщения о закрытии соединения с удаленным хостом.
Поэтому я подозреваю, что ваш сеанс PuTTY настроен не так, как ваш сеанс MobaXterm, и что происходит кое-что, о чем вы (и, следовательно, мы) не знаем.
PuTTY не отправляет сигнал, он отправляет управляющий символ ASCII. Это легко доказать. Мы просто просим оболочку сделать так, чтобы управляющий символ ASCII 0x03 (ETX, Ctrl + C) не имел специальной обработки оболочкой, а затем посмотрим, что посылает PuTTY:
$ stty intr ^A $ cat -v I will now press Ctrl + C ^C I will now press Ctrl + A $ $ echo $? 130
См. Http://tldp.org/LDP/abs/html/exitcodes.html 130 = 128 + 2 = signal 2. В этом случае я использовал ^ A для отправки 0x01 в оболочку, которая отправила сигнал 2 top
процессу. ^ C только что отправил 0x03, который cat-V
отображается как ^ C.
Поэтому я бы НЕ пытался выяснить, почему Putty «отправляет» SIGINTR, а mobaXterm - нет. Никто из них не делает этого. Они просто посылают управляющий символ ASCII.
Посмотрите, как вы вызываете PuTTY, щелкнув по значку на рабочем столе? Имеет ли этот значок свойства (Alt + Enter) с дополнительными параметрами в Target? и т. д.