Как завершить удаленно названный “хвост-f”, когда соединение закрывается?

При использовании GNOME 3 можно попытаться установить расширение индикатора рабочей области.

24
01.06.2014, 19:00
2 ответа
[1110677] В [12177] клиент [1111014]ssh[1111015] соединяется с сервером [1111016]sshd[1111017] на [1111018] хосте [1111019] через TCP-соединение. [1111020]sshd[1111021] выполняет [1111022]tail -f[1111023], а его stdout перенаправляется в трубу. [1111024]sshd[1111025] считывает то, что поступает с другого конца трубы и инкапсулирует его в протокол sshd для отправки клиенту [1111026]ssh[1111027]. (с [1111028]rshd[1111029], [1111030]tail[1111031] stdout был бы непосредственно сокет, но [1111032]sshd[1111033] добавляет шифрование и способен мультиплексировать несколько потоков (например, для порта/агента/X11/tunnel redirection, stderr) на одном TCP соединении, поэтому приходится прибегнуть к трубам).[12178] Когда вы нажимаете CTRL-C, SIGINT посылается клиенту [1111034]ssh[1111035]. Это приводит к смерти [1111036]ssh[1111037]. После умирания TCP-соединение закрывается. И поэтому на [1111038]хосте [1111039] также погибает [1111040]sshd[1111041]. [1111042] хвост [1111043] не погибает, но его вытяжка теперь представляет собой трубу без считывателя на другом конце. Таким образом, в следующий раз, когда он напишет что-то в свой stdout, он получит SIGPIPE и умрет.[12179]In:[12180]Это то же самое за исключением того, что вместо того, чтобы быть с трубой, связь между [1111044]sshd[1111045] и [1111046]tail[1111047] происходит через псевдо-терминал. Stdout хвоста [1111048] является ведомым псевдотерминалом (как [1111050]/dev/pts/12[1111051]), и что бы ни записал [1111052]tail[1111053], на стороне ведущего устройства (возможно, модифицированной дисциплиной tty line) с помощью [1111056]sshd[1111057] прочитано [1111054] и отправлено инкапсулированно клиенту [1111058]ssh[1111059]. На стороне клиента, с помощью [1111060]-t[1111061], [1111062]ssh[1111063] переводит терминал в режим [1111064] raw[1111065]. В частности, это отключает канонический режим работы терминала и обработку сигналов терминала. Таким образом, при нажатии [1111066]Ctrl+C[1111067] вместо дисциплины терминальной линии клиента посылается SIGINT на задание [1111068]ssh[1111069], который просто посылает символ [1111070]^C[1111071] через соединение на [1111072]sshd[1111073] и [1111074]sshd[1111075] записывает, что [1111076]^C[1111077] на главную сторону удаленного терминала. А линейная дисциплина удаленного терминала посылает [1111078]SIGINT[1111079] на [1111080] хвост [1111081]. Затем [1111082]хвост [1111083] умирает, и [1111084]sshd[1111085] выходит и закрывает соединение, и [1111086]ssh[1111087] завершается (если в противном случае он все еще занят переадресацией портов или другой). Также, с помощью [1111088]-t[1111089], если [1111090]ssh[1111091] клиент умрет (например, если вы введете [1111092]~..[1111093]), соединение закроется и [1111094]sshd[1111095] умрет. В результате, SIGHUP будет отправлен в [1111096]tail[1111097].[12184]Теперь остерегайтесь, что использование [1111098]-t[1111099] имеет побочные эффекты. Например, при настройках терминала по умолчанию символы [1111100]\n[1111101] преобразуются в [1111102]\r\n[1111103], и в зависимости от удаленной системы может произойти что-то еще, поэтому вы можете захотеть выпустить [1111104]stty -opost[1111105] (для отключения постобработки вывода) на удаленном хосте, если этот вывод не предназначен для терминала: [12185]Другой недостаток использования [1111106]-t[1111107]/[1111108]-tt[1111109] заключается в том, что stdout и stderr не дифференцируются на клиенте. И stdout, и stderr удаленной команды будут записаны в stdout клиента [1111110]ssh[111111111]:[12186]
33
27.01.2020, 19:41
[1110583] На удаленной стороне Вам необходимо назначить терминал:

или даже

11
27.01.2020, 19:41

Теги

Похожие вопросы