[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