Я не могу использовать комбинацию "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 с main
компьютера * nix на client
компьютер * nix. Оставляя вас в приглашении оболочки * 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
запустит интерактивный сеанс на 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 = сигнал 2. В этом случае я использовал ^ A для отправки 0x01 оболочке, которая отправила сигнал 2 top
процессу. ^ C только что отправил 0x03, cat-V
отображается как ^ C.
Поэтому я бы НЕ пытался выяснить, почему Putty "отправляет" SIGINTR, а mobaXterm - нет. Никто из них не делает этого. Они просто посылают управляющий символ ASCII.
Посмотрите, как вы вызываете PuTTY, щелкнув по значку на рабочем столе? Имеет ли этот значок свойства (Alt + Enter) с дополнительными параметрами в Target? и т. д.