[Comm] man через ssh

Alexey Bochenin bochenin на avtlg.ru
Чт Фев 24 16:46:20 UTC 2011


24.02.2011 15:55, Dmitry Chistikov пишет:
> Кстати, честно говоря, я не понимаю вот этого (последний write() в stdout
> потомка):
>
>> [pid 27496] write(1, " unfinished .\nWhen the call retu"..., 4096) = -32
>
> Почему он возвращает -32, а не -1?

Не знаю, даже если я доберусь до исходного кода приведенного фрагмента в 
bzip2, я вряд ли разберусь. Могу предположить, что это код ошибки "I/O 
or other error", во всяком случае вроде именно так ругается в дальнейшем 
bzip2


>> Да, если не заворачивать все это дело в ssh, то bzip2 молчит. Ниже
>> приведен strace по сигналам, но я не вижу SIGPIPE в листинге
>>
>> $ ssh localhost -- strace -f -e trace=signal,process -- man -w strace
>> [...]
>
> Он там есть, но не выставляется, а уже наблюдается:
>
>> [pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
>
> По-видимому, его выставяет sshd? Вообще, в его коде реакция на SIGPIPE
> для порождаемых сессий сбрасывается на умолчательный (SIG_DFL) вариант.
>
> Есть ли разница между
> $ ssh localhost -- strace -e trace=signal sh -c true
> и
>
> $ strace -e trace=signal sh -c true
>
> ?
>
> (У меня ее нет и по вызовам rt_sigprocmask видно, что SIGPIPE не
> игнорируется).
>

Дмитрий, я еще только учусь понимать strace, поэтому поный вывод привел ниже
$ ssh localhost -- strace -e trace=signal sh -c true
rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 8) = 0
rt_sigaction(SIGWINCH, {0x43e710, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, {0x42dcc0, [], SA_RESTORER, 0x7f67d5301750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f67d5301750}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
$

$ strace -e trace=signal sh -c true
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 8) = 0
rt_sigaction(SIGWINCH, {0x43e710, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, {0x42dcc0, [], SA_RESTORER, 0x7f07ef272750}, 
{SIG_DFL, [], SA_RESTORER, 0x7f07ef272750}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
$

Кстати, аналогичную ситуацию наблюдается не только в сизифе, но и гноме P5.
$ ssh localhost -- man -w bash

bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: Broken pipe
	Input file = /usr/share/man/ru/man1/bash.1.bz2, output file = (stdout)
/usr/share/man/ru/man1/bash.1.bz2
$

Доберусь до 5.1 - проверю и там

-- 
WBR, Alexey


Подробная информация о списке рассылки community