ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [Comm] man через ssh
@ 2011-02-24  6:07 Alexey Bochenin
  2011-02-24  9:28 ` Dmitry Chistikov
  0 siblings, 1 reply; 14+ messages in thread
From: Alexey Bochenin @ 2011-02-24  6:07 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Подскажите, пожалуйста, чем могут быть вызваны сообщения в SSH-консоли 
типа ниже приведенных?

$ ssh localhost man strace|head

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

bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: Broken pipe
	Input file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
STRACE(1)                                          STRACE(1)
NAME
        strace - trace system calls and signals

Мануал при этом показывается на экране, так что ошибка вроде не 
критичная. Что любопытно, возникает она лишь при просмотре больших 
руководств, типа man bash, man ls, и др. А при просмотре небольших манов 
объемом около 100 строк (man df) - в консоли нет ошибок.


Система - x86_64, Сизиф примерно на начало февраля.
$ rpm -q man
man-1.6f-alt11

$ man -d strace
Reading config file /etc/man.conf
found man directory /usr/share/man
found man directory /usr/X11R6/man
found man directory /usr/local/man
found man directory /usr/local/share/man
found manpath map /bin --> /usr/share/man
found manpath map /sbin --> /usr/share/man
found manpath map /usr/bin --> /usr/share/man
found manpath map /usr/sbin --> /usr/share/man
found manpath map /usr/local/bin --> /usr/local/share/man
found manpath map /usr/local/sbin --> /usr/local/share/man
found manpath map /usr/X11R6/bin --> /usr/X11R6/man
found manpath map /usr/bin/X11 --> /usr/X11R6/man
found manpath map /usr/bin/mh --> /usr/share/man

using /usr/bin/less -isR as pager

using /usr/bin/less -isR as browser

using /bin/cat to dump HTML pages as text

path directory /home/bochenin/bin is not in the config file
and we found no man directory nearby

path directory /bin is in the config file
adding /usr/share/man/ru to manpath
adding /usr/share/man to manpath

path directory /usr/bin is in the config file

path directory /usr/local/bin is in the config file
adding /usr/local/share/man to manpath

path directory /usr/X11R6/bin is in the config file
adding /usr/X11R6/man to manpath

path directory /usr/games is not in the config file
and we found no man directory nearby

adding mandatory man directories

adding /usr/local/man to manpath

bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: Broken pipe
	Input file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
no cat page stored because of nonstandard line length

bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: Broken pipe
	Input file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
using default preprocessor sequence
man:
not executing command:
   (cd "/usr/share/man" && man-source '/usr/share/man/man1/strace.1.bz2' 
'153' '1100i' | /usr/bin/nroff -S -p -t -Dkoi8-r -mtty -mandoc | 
/usr/bin/less -isR)


Если попробовать запустить в SSH-консоли
sh -c "(cd /usr/share/man && man-source 
'/usr/share/man/man1/strace.1.bz2' '153' '1100i' | /usr/bin/nroff -S -p 
-t -Dkoi8-r -mtty -mandoc | /usr/bin/less -isR)"
то ошибок нет

-- 
WBR, Alexey


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24  6:07 [Comm] man через ssh Alexey Bochenin
@ 2011-02-24  9:28 ` Dmitry Chistikov
  2011-02-24 10:57   ` Alexey Bochenin
  0 siblings, 1 reply; 14+ messages in thread
From: Dmitry Chistikov @ 2011-02-24  9:28 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Добрый день!

Начну с конца:

> Если попробовать запустить в SSH-консоли
> sh -c "(cd /usr/share/man && man-source 
> '/usr/share/man/man1/strace.1.bz2' '153' '1100i' | /usr/bin/nroff -S -p 
> -t -Dkoi8-r -mtty -mandoc | /usr/bin/less -isR)"
> то ошибок нет

Если Вы перечитаете вывод man -d strace, то обратите внимание на то, что
сам последний sh -c "..." и не запускается: сообщения об ошибках выводятся
раньше, например при определении preprocessor sequence:

> [...]
> bzip2: I/O or other error, bailing out.  Possible reason follows.
> bzip2: Broken pipe
> 	Input file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
> using default preprocessor sequence
> man:
> not executing command:
> [...]

В этих местах man делает
popen("/bin/bzip2 -c -d /usr/share/man/man1/strace.1.bz2", "r"),
таким образом форкаясь и заменяя (execve()) дочерний процесс на
sh -c "/bin/bzip2 -c -d /usr/share/man/man1/strace.1.bz2",
который после этого делает еще один execve на собственно
/bin/bzip2 -c -d /usr/share/man/man1/strace.1.bz2

Этот bzip2 начинает разжимать руководство и выводить его крупными кусками
в канал. Родительский процесс (сам man) читает из этого канала, причем
на данный момент ему достаточно первого куска, после чего он делает
pclose(). Если bzip2 еще не сделал всех своих write(), то на очередном
вызове он получает SIGPIPE и умирает.

У меня это происходит примерно так (заменил man -d на man -w, механика
вроде не меняется):

[pid 23192] write(1, ".\\\" Copyright (c"..., 4096) = 4096
[pid 23191] <... read resumed> ".\\\" Copyright (c"..., 4096) = 4096
[pid 23191] waitpid(23192, Process 23191 suspended
 <unfinished ...>
[pid 23192] read(4, "", 4096)           = 0
[pid 23192] write(1, ".  When the call"..., 4096) = -1 EPIPE (Broken pipe)
[pid 23192] --- SIGPIPE (Broken pipe) @ 0 (0) ---
Process 23191 resumed
Process 23192 detached
<... waitpid resumed> [{WIFSIGNALED(s) && WTERMSIG(s) == SIGPIPE}], 0) = 23192
--- SIGCHLD (Child exited) @ 0 (0) ---

Таким образом, у меня bzip2 перед смертью не успевает ничего сказать.
В Вашем примере, судя по всему, SIGPIPE не приводит к смерти bzip2,
поэтому тот, зафиксировав i/o error (для него это критично), сообщает
о пришедшем сигнале и завершается.

Я делаю вывод, что в какой-то момент на SIGPIPE ставится обработчик.
Попробуйте отследить, когда это происходит:

$ ssh localhost -- strace -f -e trace=signal,process -- man -w strace

Правильно ли я понимаю, что если не заворачивать все это дело в ssh,
то bzip2 молчит?

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24  9:28 ` Dmitry Chistikov
@ 2011-02-24 10:57   ` Alexey Bochenin
  2011-02-24 12:55     ` Dmitry Chistikov
  0 siblings, 1 reply; 14+ messages in thread
From: Alexey Bochenin @ 2011-02-24 10:57 UTC (permalink / raw)
  To: ALT Linux Community general discussions

24.02.2011 12:28, Dmitry Chistikov пишет:
> Добрый день!
>
> Начну с конца:
>
>> Если попробовать запустить в SSH-консоли
>> sh -c "(cd /usr/share/man&&  man-source
>> '/usr/share/man/man1/strace.1.bz2' '153' '1100i' | /usr/bin/nroff -S -p
>> -t -Dkoi8-r -mtty -mandoc | /usr/bin/less -isR)"
>> то ошибок нет
>
> Если Вы перечитаете вывод man -d strace, то обратите внимание на то, что
> сам последний sh -c "..." и не запускается: сообщения об ошибках выводятся
> раньше, например при определении preprocessor sequence:
>
>> [...]
>> bzip2: I/O or other error, bailing out.  Possible reason follows.
>> bzip2: Broken pipe
>> 	Input file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
>> using default preprocessor sequence
>> man:
>> not executing command:
>> [...]
>
> В этих местах man делает
> popen("/bin/bzip2 -c -d /usr/share/man/man1/strace.1.bz2", "r"),
> таким образом форкаясь и заменяя (execve()) дочерний процесс на
> sh -c "/bin/bzip2 -c -d /usr/share/man/man1/strace.1.bz2",
> который после этого делает еще один execve на собственно
> /bin/bzip2 -c -d /usr/share/man/man1/strace.1.bz2
>
> Этот bzip2 начинает разжимать руководство и выводить его крупными кусками
> в канал. Родительский процесс (сам man) читает из этого канала, причем
> на данный момент ему достаточно первого куска, после чего он делает
> pclose(). Если bzip2 еще не сделал всех своих write(), то на очередном
> вызове он получает SIGPIPE и умирает.
>
> У меня это происходит примерно так (заменил man -d на man -w, механика
> вроде не меняется):
>
> [pid 23192] write(1, ".\\\" Copyright (c"..., 4096) = 4096
> [pid 23191]<... read resumed>  ".\\\" Copyright (c"..., 4096) = 4096
> [pid 23191] waitpid(23192, Process 23191 suspended
>   <unfinished ...>
> [pid 23192] read(4, "", 4096)           = 0
> [pid 23192] write(1, ".  When the call"..., 4096) = -1 EPIPE (Broken pipe)
> [pid 23192] --- SIGPIPE (Broken pipe) @ 0 (0) ---
> Process 23191 resumed
> Process 23192 detached
> <... waitpid resumed>  [{WIFSIGNALED(s)&&  WTERMSIG(s) == SIGPIPE}], 0) = 23192
> --- SIGCHLD (Child exited) @ 0 (0) ---

Вот какое поведение наблюдаю у себя
$ ssh localhost -- strace -f -e trace=all -- man -w strace
...
[pid 27496] write(1, ".\\\" Copyright (c) 1991, 1992 Pau"..., 4096) = 4096
[pid 27495] <... read resumed> ".\\\" Copyright (c) 1991, 1992 Pau"..., 
4096) = 4096
[pid 27495] close(4)                    = 0
[pid 27495] wait4(27496, Process 27495 suspended
  <unfinished ...>
[pid 27496] read(4, "", 4096)           = 0
[pid 27496] write(1, " unfinished .\nWhen the call retu"..., 4096) = -32
[pid 27496] write(2, "\nbzip2: I/O or other error, bail"..., 67
bzip2: I/O or other error, bailing out.  Possible reason follows.
) = 67
[pid 27496] write(2, "bzip2: Broken pipe\n", 19bzip2: Broken pipe
) = 19
[pid 27496] write(2, "\tInput file = /usr/share/man/man"..., 71	Input 
file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
) = 71
[pid 27496] exit_group(1)               = ?
Process 27495 resumed
Process 27496 detached

>
> Таким образом, у меня bzip2 перед смертью не успевает ничего сказать.
> В Вашем примере, судя по всему, SIGPIPE не приводит к смерти bzip2,
> поэтому тот, зафиксировав i/o error (для него это критично), сообщает
> о пришедшем сигнале и завершается.
>
> Я делаю вывод, что в какой-то момент на SIGPIPE ставится обработчик.
> Попробуйте отследить, когда это происходит:
>
> $ ssh localhost -- strace -f -e trace=signal,process -- man -w strace
>
> Правильно ли я понимаю, что если не заворачивать все это дело в ssh,
> то bzip2 молчит?
>

Да, если не заворачивать все это дело в ssh, то bzip2 молчит. Ниже 
приведен strace по сигналам, но я не вижу SIGPIPE в листинге

$ ssh localhost -- strace -f -e trace=signal,process -- man -w strace

execve("/usr/bin/man", ["man", "-w", "strace"], [/* 15 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f3944605700) = 0
clone(Process 24150 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, 
child_tidptr=0x7f39446059d0) = 24150
[pid 24150] execve("/bin/sh", ["sh", "-c", "/bin/bzip2 -c -d 
/usr/share/man/"...], [/* 15 vars */]) = 0
[pid 24150] arch_prctl(ARCH_SET_FS, 0x7fa8bc650700) = 0
[pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
[pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
[pid 24150] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], 0}, 8) = 0
[pid 24150] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], 0}, 8) = 0
[pid 24150] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], 0}, 8) = 0
[pid 24150] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
[pid 24150] rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigaction(SIGWINCH, {0x43e710, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], 0}, 8) = 0
[pid 24150] rt_sigaction(SIGCHLD, {0x42dcc0, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
[pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
[pid 24150] rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0
[pid 24150] rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_DFL, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {SIG_IGN, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 
0x7fa8bbf25750}, {0x42dcc0, [], SA_RESTORER, 0x7fa8bbf25750}, 8) = 0
[pid 24150] execve("/bin/bzip2", ["/bin/bzip2", "-c", "-d", 
"/usr/share/man/man1/strace.1.bz2"], [/* 15 vars */]) = 0
[pid 24150] arch_prctl(ARCH_SET_FS, 0x7f638fe02700) = 0
[pid 24150] rt_sigaction(SIGSEGV, {0x401950, [SEGV], 
SA_RESTORER|SA_RESTART, 0x7f638f6c9750}, {SIG_DFL, [], 0}, 8) = 0
[pid 24150] rt_sigaction(SIGBUS, {0x401950, [BUS], 
SA_RESTORER|SA_RESTART, 0x7f638f6c9750}, {SIG_DFL, [], 0}, 8) = 0
[pid 24149] wait4(24150, Process 24149 suspended

bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: Broken pipe
	Input file = /usr/share/man/man1/strace.1.bz2, output file = (stdout)
  <unfinished ...>
[pid 24150] exit_group(1)               = ?
Process 24149 resumed
Process 24150 detached
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 
24150
--- SIGCHLD (Child exited) @ 0 (0) ---
/usr/share/man/man1/strace.1.bz2
exit_group(0)                           = ?
$





-- 
WBR, Alexey


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24 10:57   ` Alexey Bochenin
@ 2011-02-24 12:55     ` Dmitry Chistikov
  2011-02-24 16:46       ` Alexey Bochenin
  0 siblings, 1 reply; 14+ messages in thread
From: Dmitry Chistikov @ 2011-02-24 12:55 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Кстати, честно говоря, я не понимаю вот этого (последний write() в stdout
потомка):

> [pid 27496] write(1, " unfinished .\nWhen the call retu"..., 4096) = -32

Почему он возвращает -32, а не -1?

> Да, если не заворачивать все это дело в 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 не
игнорируется).

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24 12:55     ` Dmitry Chistikov
@ 2011-02-24 16:46       ` Alexey Bochenin
  2011-02-24 18:28         ` Dmitry Chistikov
  2011-02-25  8:49         ` Alexey Bochenin
  0 siblings, 2 replies; 14+ messages in thread
From: Alexey Bochenin @ 2011-02-24 16:46 UTC (permalink / raw)
  To: community

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


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24 16:46       ` Alexey Bochenin
@ 2011-02-24 18:28         ` Dmitry Chistikov
  2011-02-24 19:08           ` Dmitry Chistikov
  2011-02-25  8:49         ` Alexey Bochenin
  1 sibling, 1 reply; 14+ messages in thread
From: Dmitry Chistikov @ 2011-02-24 18:28 UTC (permalink / raw)
  To: ALT Linux Community general discussions

> > Кстати, честно говоря, я не понимаю вот этого (последний write() в stdout
> > потомка):
> >
> >> [pid 27496] write(1, " unfinished .\nWhen the call retu"..., 4096) = -32
> >
> > Почему он возвращает -32, а не -1?
> 
> Не знаю, даже если я доберусь до исходного кода приведенного фрагмента в 
> bzip2, я вряд ли разберусь. Могу предположить, что это код ошибки "I/O 
> or other error", во всяком случае вроде именно так ругается в дальнейшем 
> bzip2

Мое непонимание не имеет отношения к bzip2. write() - это системный вызов,
должен работать заранее известным образом в большинстве стандартных
ситуаций. write() никогда не должен возвращать отрицательных значений,
отличных от -1. Я совершенно не понимаю, откуда взялось число -32.

> Дмитрий, я еще только учусь понимать strace, поэтому поный вывод привел ниже
> $ ssh localhost -- strace -e trace=signal sh -c true
> rt_sigprocmask(SIG_BLOCK, NULL, [PIPE], 8) = 0

Вот здесь смотрим в man этого вызова и видим, что третий аргумент - это
возвращенное значение и оно (при данных параметрах) задает маску
игнорируемых (blocked) сигналов. Таким образом, SIGPIPE как раз
игнорируется.

> $ strace -e trace=signal sh -c true
> rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Здесь то же самое, но маска пуста, то есть игнорируемых сигналов нет.

По-видимому, это следы работы sshd (или его "сподвижников" ;)).

> Кстати, аналогичную ситуацию наблюдается не только в сизифе, но и гноме P5.
> [...]
> Доберусь до 5.1 - проверю и там

У меня есть машины с 5.1 и 4.1, на них такого эффекта не наблюдается.

Попробуйте присоединиться (-p) strace'ом (-f -e trace=process,signal) к sshd,
после чего устроить ssh localhost true (вроде все должно быть видно даже в
таком простом варианте) и поглядеть на происходящее. Сам sshd игнорирует
SIGPIPE, но, насколько я понимаю, выставляет умолчательный режим для
запускаемых "через ssh" потомков. У меня это выглядит так (прямо перед
execve("/bin/bash", ...)):

[pid  2878] rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [], 0}, 8) = 0
[pid  2878] rt_sigaction(SIGPIPE, {SIG_DFL, [], 0}, NULL, 8) = 0

Первый вызов запрашивает, какова реакция на SIGPIPE. Видно, что он
игнорируется (SIG_IGN). Второй вызов устанавливает для этого сигнала
поведение по умолчанию (SIG_DFL) - у SIGPIPE это означает завершение
процесса.

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24 18:28         ` Dmitry Chistikov
@ 2011-02-24 19:08           ` Dmitry Chistikov
  0 siblings, 0 replies; 14+ messages in thread
From: Dmitry Chistikov @ 2011-02-24 19:08 UTC (permalink / raw)
  To: ALT Linux Community general discussions

> По-видимому, это следы работы sshd (или его "сподвижников" ;)).

Вот, к слову, несколько примеров, почему такого, вообще-то, быть не должно:
http://lists.mindrot.org/pipermail/openssh-unix-dev/2000-December/003484.html
Мне кажется, что если дело действительно в самом sshd, а не, скажем, в его
неудачных настройках, то это бага, которую нужно вешать, искать и исправлять.

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-24 16:46       ` Alexey Bochenin
  2011-02-24 18:28         ` Dmitry Chistikov
@ 2011-02-25  8:49         ` Alexey Bochenin
  2011-03-03  9:45           ` Dmitry Chistikov
  1 sibling, 1 reply; 14+ messages in thread
From: Alexey Bochenin @ 2011-02-25  8:49 UTC (permalink / raw)
  To: community

24.02.2011 19:46, Alexey Bochenin пишет:
> Кстати, аналогичную ситуацию наблюдается не только в сизифе, но и гноме 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 - проверю и там

В свежеустановленном в виртуалбоксе 5.1 ошибки нет.

По мотивам 
http://lists.mindrot.org/pipermail/openssh-unix-dev/2000-December/003484.html, 
провел тестирование в виртуальном P5, и broken pipe тут как тут.
[bochenin@host-15 /]$ ssh localhost -- LANG=C yes|head -1
bochenin@localhost's password:
y
yes: standard output: Broken pipe
yes: write error
[bochenin@host-15 /]$

На рабочем компьютере тоже наблюдаю ошибку.
Но после рестарта sshd все исправилось в том числе и проблемы с man 
через ssh.

Итог: причина осталась для меня непонятной, рестарт sshd исправляет 
ситуацию с broken pipe.





-- 
WBR, Alexey


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-02-25  8:49         ` Alexey Bochenin
@ 2011-03-03  9:45           ` Dmitry Chistikov
  2011-03-03 10:59             ` Alexey Bochenin
  2011-03-04 12:11             ` Alexey Bochenin
  0 siblings, 2 replies; 14+ messages in thread
From: Dmitry Chistikov @ 2011-03-03  9:45 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Alexey Bochenin, Feb. 25, 2011, 11:49 +0300:
> Итог: причина осталась для меня непонятной, рестарт sshd исправляет 
> ситуацию с broken pipe.

С тех пор не проявлялось? Начинает ли проявляться снова после, скажем,
перезагрузки?

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-03-03  9:45           ` Dmitry Chistikov
@ 2011-03-03 10:59             ` Alexey Bochenin
  2011-03-03 11:32               ` Dmitry Chistikov
  2011-03-04 12:11             ` Alexey Bochenin
  1 sibling, 1 reply; 14+ messages in thread
From: Alexey Bochenin @ 2011-03-03 10:59 UTC (permalink / raw)
  To: ALT Linux Community general discussions

03.03.2011 12:45, Dmitry Chistikov пишет:
> Alexey Bochenin, Feb. 25, 2011, 11:49 +0300:
>> Итог: причина осталась для меня непонятной, рестарт sshd исправляет
>> ситуацию с broken pipe.
>
> С тех пор не проявлялось? Начинает ли проявляться снова после, скажем,
> перезагрузки?
>

Я ошибся, и рестарт sshd не повлиял на ситуацию с broken pipe.

Дмитрий, Вы писали насчет странности поведения функции write(...) 
возвращающей -32 вместо стандартно описанного -1.
Обновление до мартовского сизифа в какой-то степени помогло,
ssh localhost -- strace -p -e write man -w bash теперь write возвращает, 
как и описано, -1. Ошибка broken pipe, впрочем, все также присутствует.

Если важно выяснить, начиная с какой версии glibc поменялось поведение 
write (кстати, правильно ли я предположил что write() реализована именно 
в glibс?, если нет - подскажите, за какими файлами наблюдать), то 
используя архив сизифа http://www.altlinux.org/Архив_Сизифа могу 
попытаться определить версию точнее.

$ rpm -qa|grep glibc-|sort
glibc-2.11.3-alt3
glibc-core-2.11.3-alt3
glibc-devel-2.11.3-alt3
glibc-gconv-modules-2.11.3-alt3
glibc-kernheaders-2.6.36-alt5
glibc-locales-2.11.3-alt3
glibc-nss-2.11.3-alt3
glibc-preinstall-2.11.3-alt3
glibc-pthread-2.11.3-alt3
glibc-timezones-2.11.3-alt3
glibc-utils-2.11.3-alt3
i586-glibc-core-2.11.3-alt3
i586-glibc-pthread-2.11.3-alt3


-- 
WBR, Alexey


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-03-03 10:59             ` Alexey Bochenin
@ 2011-03-03 11:32               ` Dmitry Chistikov
  0 siblings, 0 replies; 14+ messages in thread
From: Dmitry Chistikov @ 2011-03-03 11:32 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Alexey Bochenin, Mar. 03, 2011, 13:59 +0300:
> Я ошибся, и рестарт sshd не повлиял на ситуацию с broken pipe.

Я бы вешал багу на openssh. Нужно объяснить, что в качестве следствий
наблюдается некорректная работа, скажем, "yes | head", а также приложить
вывод strace -p PID_OF_SSHD -f -e trace=process,signal за время выполнения
ssh localhost true (неплохо бы вначале убедиться, что в этом выводе
действительно видно, что реакция на SIGPIPE *не* сбрасывается на
умолчательное состояние).

> Дмитрий, Вы писали насчет странности поведения функции write(...) 
> возвращающей -32 вместо стандартно описанного -1.
> Обновление до мартовского сизифа в какой-то степени помогло,
> ssh localhost -- strace -p -e write man -w bash теперь write возвращает, 
> как и описано, -1.

(В данном случае "-p" быть не должно.)

> Если важно выяснить, начиная с какой версии glibc поменялось поведение 
> write (кстати, правильно ли я предположил что write() реализована именно 
> в glibс?, если нет - подскажите, за какими файлами наблюдать), то 
> используя архив сизифа http://www.altlinux.org/Архив_Сизифа могу 
> попытаться определить версию точнее.

write() - это системный вызов, реализованный в ядре, а еще, если верить
intro(2), обертка glibc (посмотрите intro(2) и syscalls(2), там написано
подробнее). Мне кажется, что наблюдавшееся тогда -32 к основному вопросу
прямого отношения не имеет, хотя, конечно, могу и ошибаться.

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-03-03  9:45           ` Dmitry Chistikov
  2011-03-03 10:59             ` Alexey Bochenin
@ 2011-03-04 12:11             ` Alexey Bochenin
  2011-03-05  7:40               ` Dmitry Chistikov
  1 sibling, 1 reply; 14+ messages in thread
From: Alexey Bochenin @ 2011-03-04 12:11 UTC (permalink / raw)
  To: community

03.03.2011 12:45, Dmitry Chistikov пишет:
> С тех пор не проявлялось? Начинает ли проявляться снова после, скажем,
> перезагрузки?
>

Кажется, удалось локализовать проблему.
steps to reproduce:

1. Установить минимальный alt, например, 
sisyphus-1.1.3-20110224-server-light-i586-ru-install-cd.iso (Пользуясь 
возможностью, хочу сказать спасибо rider@, очень удобный дистрибутив)

2.  Добавить пакет pam_mount
apt-get install pam_mount

3. Проверить поведение ssh
$ ssh localhost -- man -w bash
/usr/share/man/man1/bash.1.bz2
$

4. Добавить в файл /etc/pam.d/system-auth-local строки
auth     optional       pam_mount.so
session  optional       pam_mount.so
примерно таким образом:
$ cat /etc/pam.d/system-auth-local
#%PAM-1.0
auth		required	pam_tcb.so shadow fork prefix=$2a$ count=8 nullok
auth     optional       pam_mount.so
account		required	pam_tcb.so shadow fork
password	required	pam_passwdqc.so config=/etc/passwdqc.conf
password	required	pam_tcb.so use_authtok shadow fork prefix=$2a$ count=8 
nullok write_to=tcb
session		required	pam_tcb.so
session		required	pam_mktemp.so
session		required	pam_limits.so
session  optional       pam_mount.so

5. Убедиться в изменении поведения ssh
$ 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
$


Как и когда могли попасть строки в /etc/pam.d/system-auth-local? Не 
помню. Скорее всего, при установке из одного из старых срезов 
готовящегося 5.9.9-centaurus. Во всяком случае, на это наталкивает тема
http://lists.altlinux.org/pipermail/community/2009-June/653245.html


-- 
WBR, Alexey


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-03-04 12:11             ` Alexey Bochenin
@ 2011-03-05  7:40               ` Dmitry Chistikov
  2011-03-28 10:58                 ` Dmitry Chistikov
  0 siblings, 1 reply; 14+ messages in thread
From: Dmitry Chistikov @ 2011-03-05  7:40 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Alexey Bochenin, Mar. 04, 2011, 15:11 +0300:
> Кажется, удалось локализовать проблему.
> steps to reproduce:
> [...]
> Как и когда могли попасть строки в /etc/pam.d/system-auth-local? Не 
> помню. Скорее всего, при установке из одного из старых срезов 
> готовящегося 5.9.9-centaurus. Во всяком случае, на это наталкивает тема
> http://lists.altlinux.org/pipermail/community/2009-June/653245.html

То есть должно ловиться за руку rpmverify -f /etc/pam.d/system-auth-local
при, условно говоря, актуальной версии пакетов в рамках Сизифа или ветки.
(Так?) Ясно, спасибо!

Непонятка в том, что с июня 2009 года много воды утекло, а раз такая фича
попала в одну из бет, то она может по ошибке оказаться и в релизе.
Может кто-нибудь из заинтересованных проверить?

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Comm] man через ssh
  2011-03-05  7:40               ` Dmitry Chistikov
@ 2011-03-28 10:58                 ` Dmitry Chistikov
  0 siblings, 0 replies; 14+ messages in thread
From: Dmitry Chistikov @ 2011-03-28 10:58 UTC (permalink / raw)
  To: ALT Linux Community general discussions

Dmitry Chistikov, Mar. 05, 2011, 10:40 +0300:
> То есть должно ловиться за руку rpmverify -f
> /etc/pam.d/system-auth-local при, условно говоря, актуальной версии
> пакетов в рамках Сизифа или ветки.  (Так?) Ясно, спасибо!
> 
> Непонятка в том, что с июня 2009 года много воды утекло, а раз такая фича
> попала в одну из бет, то она может по ошибке оказаться и в релизе.
> Может кто-нибудь из заинтересованных проверить?

Для тех, кому интересно: обсуждение ушло в sisyphus@:
http://lists.altlinux.org/pipermail/sisyphus/2011-March/352950.html

-- 
Дмитрий Чистиков


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2011-03-28 10:58 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-24  6:07 [Comm] man через ssh Alexey Bochenin
2011-02-24  9:28 ` Dmitry Chistikov
2011-02-24 10:57   ` Alexey Bochenin
2011-02-24 12:55     ` Dmitry Chistikov
2011-02-24 16:46       ` Alexey Bochenin
2011-02-24 18:28         ` Dmitry Chistikov
2011-02-24 19:08           ` Dmitry Chistikov
2011-02-25  8:49         ` Alexey Bochenin
2011-03-03  9:45           ` Dmitry Chistikov
2011-03-03 10:59             ` Alexey Bochenin
2011-03-03 11:32               ` Dmitry Chistikov
2011-03-04 12:11             ` Alexey Bochenin
2011-03-05  7:40               ` Dmitry Chistikov
2011-03-28 10:58                 ` Dmitry Chistikov

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git