Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Frozen command substitution



I have two long running scripts that do complex interaction with
the web browser, say "foo" which calls the subordinate script
"bar".  The browser crashes once in a while and is restarted
automatically by some other script.  Sometimes when this happens,
foo freezes in a call of bar and won't wake up anymore when bar
terminates:

-- foo --
while true; do
	some-func
	test some-condition && break
done

some-func () {
	while true; do
		R="$(bar ssome arguments)"  <------- hangs in this line
		test some condition && return 0
	done
}
-- foo --

-- bar --
# some long-running loop
# ...

return 0
-- bar --

Ciao

Dominik ^_^  ^_^

--

So, foo calls bar in a loop.  While bar is running, the browser is
restarted.  bar detects this, finishes and exits with the "return
0".  However, foo does not continue with the line after the
command substitution.  A "ctrl-z" foollowed by "fg" does not help.
Sending it SIGUSR1 (which has a trap installed) wakes it up again.
In the process list:

  $ pstree -a
  ...
  <terminal>-+-zsh-+-foo
                   |-tee
                   +-zsh

(The whole stuff is calles with
"while true; do foo 2>&1 | tee foo.out; done".)  /proc/<pid>/status says:

  $ cat /proc/<pid>/status
  ...
  State:  S (sleeping)
  Tgid:   13030
  Ngid:   0
  Pid:    13030
  PPid:   24927
  ...

foo has a trap for "HUP" installed, and that's being called when
when I type "killall -HUP foo", so the shell is not dead.  "ps"
lists the processes' status as "S+".

Dominik Vogt




Messages sorted by: Reverse Date, Date, Thread, Author