ALT Linux Community general discussions
 help / color / mirror / Atom feed
From: Alexey Bochenin <bochenin@avtlg.ru>
To: ALT Linux Community general discussions <community@lists.altlinux.org>
Subject: Re: [Comm] man через ssh
Date: Thu, 24 Feb 2011 13:57:17 +0300
Message-ID: <4D66398D.2070606@avtlg.ru> (raw)
In-Reply-To: <20110224092844.GB7131@conflux.foliandre>

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


  reply	other threads:[~2011-02-24 10:57 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-24  6:07 Alexey Bochenin
2011-02-24  9:28 ` Dmitry Chistikov
2011-02-24 10:57   ` Alexey Bochenin [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4D66398D.2070606@avtlg.ru \
    --to=bochenin@avtlg.ru \
    --cc=community@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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